Hyperf 日志系统基于 PSR-3,默认使用协程安全的 Monolog;配置在 logger.php,支持多 handler/ formatter、多级分离(如 sql.log/access.log)、JSON/行格式化及运行时动态调级。

Hyperf 日志系统基于 PSR-3 标准,底层默认使用 Monolog 驱动,天然支持协程安全(Swoole 已协程化 fopen/fwrite,只要不启用 useLocking 即可)。配置核心在 config/autoload/logger.php,通过定义多个 handler 和 formatter,可灵活控制日志级别、输出位置、格式与轮转策略。
基础配置:指定输出路径与默认级别
修改 config/autoload/logger.php 中的 default 配置项:
-
日志文件路径:用
BASE_PATH . '/runtime/logs/hyperf.log'指向实际目录(确保runtime/logs可写) -
最低记录级别:如设为
Monolog\Logger::INFO,则debug()不会写入 -
Handler 类型:默认
StreamHandler写文件;若需按天切分,改用RotatingFileHandler并配置maxFiles
多级日志分离:按级别或用途分文件
可在同一配置中定义多个 logger 名称(如 'sql'、'access'、'daily'),每个绑定独立 handler:
- SQL 日志单独存为
sql.log,便于排查慢查询(需配合DbQueryExecutedListener拦截) - 访问日志用
RotatingFileHandler,设置filename => 'access.log'+maxFiles => 30 - 调用方式:
$loggerFactory->get('sql', 'sql'),第一个参数是 channel 名,第二个对应配置键名
日志格式与结构化字段
通过 formatter 控制输出样式。推荐两种实践:
-
开发环境:用
LineFormatter,开启allowInlineLineBreaks,便于阅读 -
对接日志服务(如阿里云 SLS):使用 JSON 格式(
JsonFormatter),字段含time、level、message、context,方便正则提取与索引 - 自定义 formatter 可继承
LineFormatter,重写format()加入 trace_id、request_id 等上下文
运行时动态控制日志级别
不需重启服务即可临时调高/降低某类日志输出量:
- 在代码中获取 logger 实例后,调用
setLevel(Monolog\Logger::DEBUG) - 结合环境变量(如
LOG_LEVEL=debug)在配置中动态赋值level参数 - 对关键业务方法,可用
context传入用户 ID、订单号等,提升可追溯性
配置本身不复杂,但容易忽略 handler 的协程安全性、formatter 的时间戳时区一致性、以及多 handler 下 channel 名与配置键的匹配关系。理清这三点,日志就稳了。










