ThinkPHP 6.0 默认不自动清理日志,需手动配置 Monolog 的 RotatingFileHandler 实现轮转:设 type 为 'monolog',传入 RotatingFileHandler 实例,指定 $maxFiles(如7)控制最多保留文件数,显式传入 DateTimeZone 避免切割错乱,并关闭缓冲(第4参数 false)确保及时切割。

ThinkPHP 6.0 默认不设日志保留天数,只按天生成新文件(如 think-2026-10-29.log),旧文件永不自动删除——所以“最大保留天数”不是开箱即用的配置项,必须通过 Monolog 的 RotatingFileHandler 手动实现,本质是控制**最多保留多少个日志文件**,而非直接填“7天”或“30天”。
改用 RotatingFileHandler 驱动
TP6 原生支持 Monolog,但默认日志通道(type => 'File')不具备轮转清理能力。需切换为 monolog 类型并注入 RotatingFileHandler 实例:
- 执行
composer require monolog/monolog(TP6 ≥ v6.0.13 推荐) - 编辑
config/log.php,将file通道的type改为'monolog' - 在
handler选项中用闭包返回实例,关键参数:new \Monolog\Handler\RotatingFileHandler($filename, $maxFiles = 7, ..., new \DateTimeZone('Asia/Shanghai')) - $maxFiles = 7 表示最多保留 7 个日志文件(含当天),超出后自动删除最旧的一个;这等效于“保留最近 7 天”(前提是每天只生成一个文件)
确保时区正确,避免切割错乱
RotatingFileHandler 按系统时间判断是否新建文件。若不显式传入时区对象,服务器时区与应用预期不符,可能导致:
- 某天生成两个日志文件(如 23:59 和 00:01 各一个)
- 漏切,连续多天写入同一文件
- 解决方法:第 5 个参数必须是
new \DateTimeZone('Asia/Shanghai')(根据你服务器实际时区调整)
注意缓冲与实时写入的影响
TP6 默认启用日志缓冲,会导致 RotatingFileHandler 切割不及时(比如文件已超 5MB,还在往旧文件里写):
立即学习“PHP免费学习笔记(深入)”;
- 若希望严格按大小或时间点切割,需关闭缓冲:第 4 个参数传
false - 例如:
new RotatingFileHandler($filename, 7, null, false, new \DateTimeZone('Asia/Shanghai')) - 同时确认
realtime_write在通道配置中设为true,或依赖框架请求结束时的统一 flush
不推荐依赖外部脚本删日志
用 find runtime/log -mtime +7 -delete 这类命令风险高:
- 可能误删当日正在写的日志(如
think-2026-10-29.log),导致后续写入失败 - 文件修改时间(
filemtime)比文件名日期更可靠,但依然不如 RotatingFileHandler 内置机制安全 - 生产环境应以 Monolog 驱动为主,脚本仅作兜底或归档用途



















