Hyperf 日志轮转需精准控制命名格式、保留策略、触发时机和归档行为:设 maxFiles 控制保留天数,用 filenameFormat 加 {date} 实现按日切割,禁用 maxFileSize;启用 compress 参数或 Cron 脚本压缩旧日志;按业务拆分通道独立配置轮转;通过 Processor 动态脱敏敏感字段。

Hyperf 默认使用 Monolog 配合 RotatingFileHandler 实现日志轮转,但默认配置下容易出现「日志不自动切割」「旧日志未压缩」「文件名规则难追溯」等问题。关键不是换组件,而是精准控制 命名格式、保留策略、触发时机和归档行为。
自定义 RotatingFileHandler 的切割逻辑
Hyperf 日志底层基于 Monolog,直接修改 config/autoload/logger.php 中的 handler 配置即可干预轮转行为:
- 设置
maxFiles控制保留天数(如30表示保留最近 30 个日志文件) - 用
filenameFormat自定义文件名,推荐加入{date}占位符,例如:'filenameFormat' => 'hyperf-{date}.log',避免默认按大小轮转导致日期混乱 - 禁用按大小轮转:将
maxFileSize设为0或直接移除该配置,专注按日切割
启用日志自动压缩(gzip)
Hyperf 原生不压缩旧日志,需手动扩展。可在 RotatingFileHandler 后追加一个自定义处理器,或使用社区方案:
- 安装
monolog/monolog扩展包(确保版本兼容 Hyperf 3.x/4.x) - 在
logger.php中替换 handler 为支持压缩的类,例如:'handler' => \Monolog\Handler\RotatingFileHandler::class,
并传入'compress' => true参数(需 Monolog ≥ 2.10) - 若需更细粒度控制(如仅压缩 >7 天的日志),可写一个简单的
Cron脚本定期执行gzip命令
分离不同通道日志并独立轮转
避免所有日志挤在 hyperf.log 里,按业务拆分通道后可分别配置轮转策略:
- 在
logger.php的channels中新增通道,如'sql' => [...]、'api' => [...] - 每个通道指定独立
path和专属handler配置,比如 SQL 日志设为每日轮转 + 保留 7 天,API 日志设为每小时轮转 + 保留 48 小时 - 调用时使用
LoggerFactory::get('sql')显式获取通道,日志自动写入对应文件且互不影响轮转
隐藏敏感字段,但保留调试能力
日志中常含 token、手机号等,不能靠“不记录”解决,而应动态脱敏:
- 在
logger.php的processors中添加自定义 Processor 类,匹配message或context中的关键词(如token、phone)并替换为*** - 生产环境启用脱敏,开发环境跳过——通过
env('APP_ENV') === 'prod'控制开关 - 注意:不要脱敏整个
context数组,只处理已知敏感键,避免影响异常堆栈和 trace_id 等关键字段










