thinkphp6升级后日志暴增是因默认filehandler不设maxfiles导致旧文件永不删除;应改用monolog rotatingfilehandler按天或按大小轮转,并传入正确时区,再清理7天前日志及清空当日文件。

ThinkPHP升级后日志文件突然暴增,往往不是因为功能增强,而是默认行为变更导致旧配置失效——比如TP6.0起日志通道不再自动清理旧文件,哪怕你只保留最近3天日志,2025年1月的日志仍会静静躺在runtime/log/里持续占用空间。
确认是否触发了默认日志膨胀机制
打开 runtime/log/ 目录,执行 ls -lt | head -20,观察文件列表中是否存在大量跨月甚至跨年的日志文件(如 think-2025-03-12.log、think-2024-11-01.log)。
若发现文件名日期跨度超过7天且数量远超预期,说明已落入TP6默认“只生不死”陷阱:【TP6默认FileHandler不设maxFiles,旧文件永不删除】。
这与TP5或更早版本行为不同——升级后未改log.php配置,就会立刻开始堆积。
切换为Monolog RotatingFileHandler(推荐)
方法一:按天保留 + 限定份数
1、执行 composer require monolog/monolog(TP6 ≥ v6.0.13才原生支持RotatingFileHandler)
2、编辑 config/log.php,将 'file' 通道的 type 改为 'monolog',并在 handler 中用闭包返回 RotatingFileHandler 实例:
'handler' => function () {
return new \Monolog\Handler\RotatingFileHandler(
runtime_path('log') . 'think-' . date('Y-m-d') . '.log',
【30】, // 最多保留30个文件(含当天),超出自动删最老的
null,
true,
new \DateTimeZone('Asia/Shanghai')
);
}
注意:必须传入 【new \DateTimeZone('Asia/Shanghai')】,否则服务器时区错位会导致切割时间漂移,可能某天生成两个文件或漏切。
方法二:按大小轮转 + 关闭缓冲
若日志写入极高频,建议改用 size 控制:
'handler' => function () {
return new \Monolog\Handler\RotatingFileHandler(
runtime_path('log') . 'think.log',
7,
null,
【false】, // 关键!必须关缓冲,否则写满10MB还在往旧文件里写
new \DateTimeZone('Asia/Shanghai')
);
},
'max_size' => '10M'
立即清理已有积压日志
第一步:停止PHP-FPM或Web服务器(避免写入竞争)
systemctl stop php-fpm
第二步:精准删除7天前的旧日志(跳过当日正在写的文件)
find runtime/log/ -type f -name "think-*.log" -mtime +7 -delete
第三步:清空当前日志内容(非删除文件),释放磁盘空间
> runtime/log/think-$(date +%Y-%m-%d).log
这一步操作起来很简单,直接重定向清空即可,比 rm 更安全——不会破坏PHP进程持有的文件句柄,空间立刻释放。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











