ThinkPHP6需改用Monolog的RotatingFileHandler实现按大小轮转日志,关键配置包括:type设为monolog、handler中实例化RotatingFileHandler并设max_files=7、max_size='10M'、buffering=false、传入Asia/Shanghai时区对象。

ThinkPHP6 默认的 FileHandler 不支持按大小轮转,单文件会持续追加直到手动清理。要限制单日志文件大小,必须切换为 Monolog 的 RotatingFileHandler,并关闭写入缓冲 —— 否则即使设了 max_size,也会因缓冲延迟导致文件远超预期。
配置 RotatingFileHandler 按大小轮转
在 config/log.php 中修改日志通道(如 'file'):
- 将
'type' => 'file'改为'type' => 'monolog' - 在
'handler'闭包中实例化RotatingFileHandler,关键参数如下:
示例(限制单文件 ≤ 10MB,最多保留 7 个文件):
'handler' => function () {
return new \Monolog\Handler\RotatingFileHandler(
runtime_path('log') . 'think.log',
7, // 最多保留 7 个轮转文件(含当前)
null,
false, // ⚠️ 必须设为 false:关闭缓冲,否则切不准
new \DateTimeZone('Asia/Shanghai')
);
},
'max_size' => '10M' // 字符串格式,单位支持 M / KB / B
-
false是核心:TP6 默认开启缓冲,不关会导致写满 12MB 才切,严重偏离设定 -
max_size必须是字符串(如'10M'或'10485760'),不能是整数 - 时区对象
new \DateTimeZone('Asia/Shanghai')不可省略,否则切割时间错乱
确认依赖与版本兼容性
确保满足以下前提:
立即学习“PHP免费学习笔记(深入)”;
- 已执行
composer require monolog/monolog - ThinkPHP 版本 ≥ 6.0.13(低版本不原生支持
RotatingFileHandler的完整参数) - 运行
php think version核对实际版本
立即生效前的清理动作
旧日志不会自动被新配置清理,需手动处理:
- 停服务:
systemctl stop php-fpm(避免写入冲突) - 清空积压:
find runtime/log/ -name "think.log*" -type f -delete - 重启服务后,新日志将严格按
max_size切割,超限即生成think.log.1、think.log.2… 并自动淘汰最老的



















