需通过Composer安装Monolog并手动配置:一、确认PHP≥7.3且Composer可用;二、执行composer require monolog/monolog:^2.10;三、在common.php中引入autoload、实例化Logger并绑定容器;四、配置LineFormatter启用trace与context;五、控制器中通过容器获取实例记录日志。

如果您希望在ThinkPHP项目中集成Monolog日志库以增强日志记录能力,则需通过Composer安装并正确配置。以下是实现该目标的具体步骤:
一、确认环境兼容性与Composer可用性
Monolog 2.x 要求 PHP 版本不低于 7.3,且必须依赖 Composer 进行依赖管理。若环境不满足基础条件,后续安装与集成将无法正常执行。
1、打开终端,执行 php -v 检查当前 PHP 版本,确保输出版本号 ≥ 7.3。
2、执行 composer --version 验证 Composer 是否已全局安装并可调用。
立即学习“PHP免费学习笔记(深入)”;
3、若命令报错,需访问 https://getcomposer.org/download/ 下载安装脚本,并按官方说明完成配置。
二、使用Composer安装Monolog依赖
在 ThinkPHP 项目根目录(即包含 think 目录与 composer.json 的路径)中引入 Monolog 官方包,确保其可被自动加载。
1、进入项目根目录,执行命令:composer require monolog/monolog:^2.10。
2、等待安装完成,检查 vendor/monolog/monolog 目录是否存在,且 vendor/autoload.php 可被正常包含。
3、如遇权限或网络问题,可尝试添加镜像源:composer config -g repo.packagist composer https://packagist.phpcomposer.com。
三、手动创建并注册Monolog实例
ThinkPHP 默认日志系统不可直接替换 handler,需绕过内置 Log 类,在应用初始化阶段手动构建 Logger 实例并绑定至容器,使其全局可获取。
1、编辑 app/common.php(或应用启动入口初始化文件)。
2、在文件开头添加:require_once __DIR__ . '/../vendor/autoload.php';。
3、实例化 Logger:$logger = new \Monolog\Logger('thinkphp');。
4、添加 RotatingFileHandler(推荐线上使用):$logger->pushHandler(new \Monolog\Handler\RotatingFileHandler('../runtime/log/app.log', 30, \Monolog\Logger::INFO));。
5、绑定至容器:\think\Container::getInstance()->bind('monolog', function() use ($logger) { return $logger; });。
四、配置LineFormatter启用上下文与堆栈追踪
默认日志无堆栈信息和上下文结构,不利于线上排障;通过注入 LineFormatter 并启用 trace 与 context 输出,可显著提升日志可读性与调试效率。
1、在创建 Handler 后、pushHandler 前,新增格式器实例:$formatter = new \Monolog\Formatter\LineFormatter(null, null, true, true);。
2、将格式器绑定至 Handler:$handler->setFormatter($formatter);(注意:$handler 需为上一步创建的 RotatingFileHandler 或 StreamHandler 对象)。
3、确保第 3 个参数为 true 表示启用 trace,第 4 个参数为 true 表示格式化上下文数组。
五、在控制器中调用Monolog记录日志
通过容器获取已注册的 Monolog 实例后,即可使用标准 PSR-3 方法写入结构化日志,支持多通道、多级别、带上下文的统一输出。
1、在控制器方法内获取实例:$log = \think\Container::getInstance()->get('monolog');。
2、记录带上下文的信息日志:$log->info('User login success', ['uid' => 123, 'ip' => request()->ip()]);。
3、记录含堆栈的错误日志:$log->error('Database connection failed', ['exception' => $e->getMessage()]);。



















