直接运行 composer require monolog/monolog 安装,PHP 版本需 ≥7.2(v2)或 ≥8.1(v3),安装后检查 vendor/monolog/monolog/src/Monolog/Logger.php 是否存在;初始化时用 Logger 配 StreamHandler 与 LineFormatter,确保目录可写、级别匹配、格式可读;推荐 RotatingFileHandler 防止日志膨胀,并注意权限与缓冲问题。

Monolog 怎么用 composer 安装
直接运行 composer require monolog/monolog 就行,不需要加 --dev(除非你只在测试或命令行工具里用日志,生产环境记录必须是常规依赖)。
常见错误是手动改 composer.json 后忘记 composer install 或 composer update,结果代码里 use Monolog\Logger; 仍报类找不到——本质是 autoloader 没刷新。
- PHP 版本需 ≥ 7.2(Monolog v2),v3 要求 ≥ 8.1,装之前先看
php -v - 如果项目已锁死旧版依赖(比如 laravel 5.8),
monolog/monolog:^2.0可能因冲突装不上,得加--with-all-dependencies或降级到^1.26 - 装完检查
vendor/monolog/monolog/src/Monolog/Logger.php是否存在,比看命令输出更可靠
怎么初始化一个可用的 Logger 实例
别一上来就 new Logger 然后塞 StreamHandler —— 这样日志会写进文件但没格式、没级别过滤、没轮转,线上跑几天就撑爆磁盘。
最简但可落地的初始化方式:
$logger = new Monolog\Logger('app');
$handler = new Monolog\Handler\StreamHandler(__DIR__.'/logs/app.log', Monolog\Logger::INFO);
$handler->setFormatter(new Monolog\Formatter\LineFormatter(null, null, true, true));
$logger->pushHandler($handler);
-
StreamHandler的第二个参数是最低记录级别,设成INFO就不会记DEBUG;设成WARNING就连INFO都不写 - 路径
__DIR__.'/logs/app.log'要确保logs/目录存在且 web server 有写权限,否则静默失败(无报错,日志就是不出现) - 别漏掉
setFormatter,否则默认输出是 JSON,人眼难读;LineFormatter第三个参数true表示启用颜色(CLI 下有用),第四个true表示显示毫秒时间戳
怎么避免日志文件无限增长
用 RotatingFileHandler 替代 StreamHandler,它会自动按天或按大小切分文件,老日志还能压缩。
注意:不是所有版本都支持压缩。Monolog v2.0+ 才内置 GzipRotateHandler,v1.x 得自己包装或用第三方 handler。
- 按天轮转:
new Monolog\Handler\RotatingFileHandler(__DIR__.'/logs/app.log', 0, Monolog\Logger::INFO),第三个参数0表示不限制保留天数(慎用),推荐传7 - 按大小轮转:加第四个参数,如
10485760(10MB),配合0天数,效果是“最多存 7 个 10MB 文件” - 如果用了
RotatingFileHandler却发现没轮转,大概率是日志目录权限不对,或者 PHP 进程用户(如 www-data)没权限重命名旧文件
为什么写了日志却看不到内容
最常卡在三处:级别过滤、异步写入延迟、错误被 silence 掉。
- 调用
$logger->info('hello')没输出?先确认 handler 设置的最低级别 ≤INFO,再查 handler 是否被pushHandler成功($logger->getHandlers()能看到数组长度) - CLI 脚本里日志延迟出现?可能是 buffer 没 flush,加
$logger->close()在脚本末尾,或 handler 构造时传false关闭 buffering(new StreamHandler(..., ..., false)) - Web 请求中完全没日志?检查是否在
try/catch里吞了异常又没 re-throw,或者error_reporting(0)把错误关了,Monolog 不处理 PHP 错误,只记录你主动打的日志
日志系统本身不复杂,但和权限、路径、级别、缓冲这几个点缠在一起,很容易某个环节断掉就全黑。调试时优先看 handler 是否生效、文件路径是否可写、级别是否匹配,比翻源码快得多。










