在ThinkPHP 5.1中引入Monolog替代默认日志系统是合理选择,需安装monolog/monolog:^2.10、手动封装Logger类、迁移配置项并保持格式兼容。

确认兼容性与安装方式
TP5.1 基于 PHP 7.1+,Monolog 2.x 完全支持(推荐 monolog/monolog:^2.10)。执行:
composer require monolog/monolog:^2.10- 确保
runtime/log/目录可写(Web 服务器用户有读写权限) - TP5.1 不依赖容器自动绑定,所以无需修改
app.phpproviders,只需手动初始化
封装 Monolog 实例并替换 Log::write()
TP5.1 的 Log::write() 是静态方法,不能直接替换为 Monolog 对象。建议新建一个日志服务类(如 app/common/Logger.php),统一管理:
- 构造时创建
Monolog\Logger实例,并添加RotatingFileHandler(按天轮转,避免单文件膨胀) - 用
LineFormatter或JsonFormatter输出结构化日志 - 提供静态方法
info()、error()等,签名与 TP5.1 一致($message, $context = []) - 旧代码中把
Log::write('xxx', 'error')改为Logger::error('xxx'),平滑过渡
配置项迁移要点
TP5.1 的 config/log.php 中原参数(如 max_files、file_size)对 Monolog 无效。需改由处理器控制:
-
RotatingFileHandler的第 2 个参数是保留天数(如7),不是字符串 - 日志级别用
\Monolog\Logger::ERROR常量,不是字符串'error' - 路径统一用
Env::get('root_path') . 'runtime/log/',避免硬编码 - 不建议用
StreamHandler写单文件——线上环境必须轮转
保留原有行为的技巧
为减少改动成本,可让 Monolog 日志格式尽量贴近 TP5.1 默认输出:
- 使用
LineFormatter,格式设为[{datetime}] {level_name}: {message} {context} - 开启
include_stacktrace仅用于开发环境(性能敏感) - 若需 trace_id,可在请求入口生成唯一 ID(如
uniqid('req_')),通过Processor注入到每条日志的$context - 错误日志仍可触发
think\exception\Handle的异常捕获逻辑,只需在异常处理器里调用你的Logger::error()


















