直接运行 composer require monolog/monolog 即可安装,但集成关键在配置、日志级别控制和处理器选择;推荐使用 Monolog 2.x(如 ^2.10),PHP 7.4+ 兼容,Laravel/Symfony 项目无需手动安装。

直接运行 composer require monolog/monolog 就能装上,但实际集成时容易卡在配置、日志级别控制或处理器选择上。
用 Composer 安装 Monolog 的正确命令和版本控制
Monolog 2.x 是当前主流,PHP 7.4+ 推荐用最新稳定版。执行命令前确认项目已初始化 Composer(即存在 composer.json):
- 安装最新稳定版:
composer require monolog/monolog - 指定 2.x 版本(避免意外升级到 3.x,目前 3.x 要求 PHP 8.1+):
composer require monolog/monolog:^2.10 - 如果项目用了 Laravel 或 Symfony,别手动装——它们自带 Monolog,只需配置,不需重复引入
初始化 Logger 实例的常见写法和坑点
装完后不能直接用 Logger 类,得先 use 并实例化。最简可用示例:
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
$logger = new Logger('my_app');
$logger->pushHandler(new StreamHandler(__DIR__.'/app.log', Logger::INFO));
$logger->info('User logged in', ['user_id' => 123]);
注意几个关键点:
-
Logger构造函数第一个参数是 channel 名,不是文件名,多个 channel 可共用一个 handler,也便于后期按模块过滤日志 -
StreamHandler第二个参数是日志级别阈值(如Logger::INFO),低于该级别的日志(如debug())不会写入 - 路径必须有写权限,否则静默失败——建议加个
is_writable()检查
怎么让日志同时输出到文件和控制台
Monolog 支持多 handler,但新手常误以为加两个 pushHandler() 就自动生效,其实还要确保级别匹配:
- 文件 handler 可设为
Logger::WARNING,只存警告以上 - 控制台 handler(
ConsoleHandler)推荐用Logger::DEBUG,方便本地调试 - 记得
require控制台 handler:composer require symfony/console(Monolog 2.x 不再自带) - 示例片段:
use Monolog\Handler\ConsoleHandler;
use Monolog\Handler\StreamHandler;
$logger->pushHandler(new StreamHandler('php://stderr', Logger::WARNING));
$logger->pushHandler(new ConsoleHandler(Logger::DEBUG));
为什么日志没生成?排查顺序
最常被忽略的是错误抑制和权限问题,而不是代码逻辑:
- 检查
error_reporting和display_errors是否关闭——Monolog 不抛异常,写失败时只返回 false 或静默丢弃 - 确认日志目录存在且 PHP 进程有写权限:
touch test.log && chmod 644 test.log - 查看是否被其他 handler 拦截:调用
$logger->getHandlers()看是否真添加成功 - Monolog 默认不格式化时间戳为本地时区,如果看到时间错乱,需手动设置:
$logger->pushProcessor(new \Monolog\Processor\IntrospectionProcessor());
真正麻烦的不是安装,而是 handler 链的组合逻辑和错误静默行为——它不会告诉你哪一步断了,只能靠逐层验证。










