根本原因是TP6默认FileHandler不设maxFiles导致旧日志永不删除;须改用Monolog RotatingFileHandler配置轮转、显式传入时区、关闭缓冲,并清理积压文件及叠加logrotate兜底。

ThinkPHP6.0 日志文件暴增,根本原因不是“写得多”,而是默认不清理旧文件——每天生成 think-2026-10-28.log 这类新文件,但 think-2025-03-15.log 会一直躺着不动,几个月后 runtime/log/ 占用几十 GB 很常见。
要真正解决问题,得从轮转机制、配置修正、积压清理、运行环境四方面同步处理。
改用 RotatingFileHandler 实现自动轮转
TP6 原生支持 Monolog,但默认 `FileHandler` 不设 `maxFiles`,等于“只生不死”。必须手动切换为 `RotatingFileHandler`:先安装依赖(TP6 ≥ v6.0.13 才完整兼容):
composer require monolog/monolog-
修改
config/log.php中的file通道:立即学习“PHP免费学习笔记(深入)”;
'file' => [ 'type' => 'monolog', 'handler' => function () { return new \Monolog\Handler\RotatingFileHandler( runtime_path('log') . 'think-' . date('Y-m-d') . '.log', 7, // 最多保留最近 7 个日志文件(含当天) null, true, new \DateTimeZone('Asia/Shanghai') // 时区必须显式传入,否则切割错乱 ); } ] -
⚠️ 注意:
7指的是文件数量,不是天数;若你希望按大小轮转(比如单个不超过 5MB),则改为:new \Monolog\Handler\RotatingFileHandler( runtime_path('log') . 'think.log', 30, // 最多保留 30 个历史文件 null, false, // 关键!必须关缓冲,否则写满也不切 new \DateTimeZone('Asia/Shanghai') ), 'max_size' => '5M'
立即清理已有积压日志
轮转配置生效前,先清掉历史包袱,避免磁盘被占满:停止 PHP-FPM(防止写入冲突):
systemctl stop php-fpm安全删除 7 天前的日志(跳过当日正在写的文件):
find runtime/log/ -name "think-*.log" -type f ! -newermt "$(date -d '7 days ago' +%Y-%m-%d)" -delete清空当天日志内容(不删文件,释放空间):
> runtime/log/think-$(date +%Y-%m-%d).log启动服务:
systemctl start php-fpm
关闭调试与冗余日志输出
生产环境开启 debug 或记录全量 SQL,会极大加剧日志体积:确保
app_debug = false(在.env或config/app.php中)日志级别设为
error或warning:config/log.php中设置'level' => 'error'批量操作前临时禁用 SQL 日志:
Db::setLogLevel(0),操作完成后恢复移除开发期调试代码,如
Db::getLastSql()、dump()、trace()调用
加一层系统级防护(推荐长期使用)
仅靠 PHP 层控制仍有风险,建议叠加 Linux `logrotate`:- 创建
/etc/logrotate.d/thinkphp:/path/to/project/runtime/log/*.log { daily missingok rotate 7 compress delaycompress copytruncate notifempty create 644 www-data www-data } - 替换
/path/to/project为项目真实路径 -
copytruncate确保 PHP 进程无需重启即可继续写日志 - 配合后,即使 PHP 层轮转异常,系统层仍兜底压缩归档
不复杂但容易忽略:轮转配置生效的前提是时区正确 + 缓冲关闭 + maxFiles 显式设置,三者缺一不可。



















