ThinkPHP6需配置RotatingFileHandler并配合系统级脚本实现日志自动清理:前者按文件数量轮转(如7个),后者用find -mtime +7删除7天前日志,确保安全精准过期。

ThinkPHP6 默认不会自动删除旧日志文件,哪怕你只想要最近7天的日志,2025年1月的 think-2025-01-01.log 依然会一直留在 runtime/log/ 目录里——这不是日志写得多,而是“只生成、不清理”。
要真正实现自动过期清理,不能依赖 php think clear --log(它清的是全部,不分新旧),也不能靠手动 rm(容易误删当日正在写的文件),必须从配置驱动层和系统级清理机制两方面入手。
配置 RotatingFileHandler 实现自动轮转与淘汰
TP6 原生支持 Monolog,但默认 FileHandler 不带清理逻辑。需切换为 RotatingFileHandler,并显式设定保留上限:
-
安装依赖(TP6 ≥ 6.0.13 推荐):
立即学习“PHP免费学习笔记(深入)”;
composer require monolog/monolog
-
修改
config/log.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指的是文件个数,不是天数。若每天生成1个,就等效保留7天;若某天因错误高频写入生成多个,可能实际保留不足7天。如需严格按天,建议配合定时脚本补位。
生产环境安全清理脚本(推荐每日执行)
即使配置了 RotatingFileHandler,仍建议加一层系统级兜底清理,避免因进程异常导致轮转失效:
# 停止写入(可选,高并发场景建议) systemctl stop php-fpm # 清理7天前的日志(跳过当日文件,不删、不清空) find runtime/log/ -type f -name "think-*.log" -mtime +7 -delete # 清空当日日志内容(释放空间,不删文件) > runtime/log/think-$(date +%Y-%m-%d).log # 重启服务(如之前停了) systemctl start php-fpm
✅ 关键点:用
-mtime +7而非按文件名匹配日期,因为filemtime()才反映真实最后修改时间;当日文件不会被误删。
验证是否生效
执行后检查:
ls -lt runtime/log/think-*.log | head -10
应只看到最近7天左右的文件,且文件名日期连续、无跨月堆积。
不复杂但容易忽略。



















