ThinkPHP6日志磁盘占用过大是因为默认FileHandler未设maxFiles导致旧日志不自动删除;需三步排查:确认积压事实、定位配置缺陷(应改type为monolog并用RotatingFileHandler)、验证清理机制(传时区对象且关闭缓冲)。

ThinkPHP6 日志占用磁盘过大,核心原因不是日志写得多,而是旧日志文件从不自动删除——升级后沿用 TP5 配置,却忽略了 TP6 默认 FileHandler 不设 maxFiles,导致“只生不死”。排查要分三步走:确认堆积事实、定位配置缺陷、验证清理机制是否生效。
检查 runtime/log/ 是否已大量积压
直接进入项目根目录,运行:
ls -lt runtime/log/think-*.log | head -15
观察输出中的文件名日期。若出现跨月甚至跨年文件(如 think-2025-08-12.log、think-2024-12-01.log),且数量远超你预期保留天数(比如你只想留 7 天,却看到 50+ 个文件),就坐实了“默认不清理”问题。注意:TP6 不会因设置了 'days' => 7 就自动删旧文件,该参数在原生 FileHandler 中完全无效。
核对 log.php 中是否仍用原生 FileHandler
打开 config/log.php,找到 'file' 通道配置,重点看这两处:
立即学习“PHP免费学习笔记(深入)”;
- type 是否还是 'file'?如果是,说明没切换到支持轮转的驱动;
-
handler 是否为闭包返回
RotatingFileHandler?若仍是数组配置或空着,就等于没启用轮转逻辑。
常见错误配置:
'type' => 'file', // ❌ 升级后未改,旧行为持续生效<br>'max_files' => 7, // ❌ 此项对原生 file 类型无作用
正确做法是把 type 改为 'monolog',并在 handler 中用闭包注入 RotatingFileHandler 实例,并显式传入时区和 $maxFiles 参数。
验证 RotatingFileHandler 是否真正生效
即使配了 RotatingFileHandler,也可能因两个细节失效:
-
缺时区对象:必须传
new \DateTimeZone('Asia/Shanghai'),否则服务器时区与 PHP 默认 UTC 不一致,会导致切割时间错乱(比如凌晨 1 点才切新文件,或同一天生成两个文件); -
缓冲未关闭(按大小轮转时):若用
max_size控制单文件体积,第 4 个参数必须设为false关闭缓冲,否则写满也不会立即切换,旧文件持续膨胀。
执行一次请求后,再查 runtime/log/:当天应只有一个新文件(如 think-2026-10-29.log),且文件大小不超过设定阈值;连续几天后,总文件数不应超过你配置的 $maxFiles 值。
立即释放空间的临时操作
在配置修复前,先腾出磁盘空间:
- 停服务:
systemctl stop php-fpm(避免写入竞争); - 删旧日志:
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,并确认新日志能正常写入。



















