ThinkPHP 6.0 默认日志不自动清理,仅按天生成新文件而永不删除旧文件,导致 runtime/log/ 目录持续膨胀;需通过 Monolog RotatingFileHandler 配置 maxFiles 或 max_size 并关闭缓冲才能实现自动轮转与清理。

ThinkPHP 6.0 默认日志不自动清理,runtime/log/ 目录下文件只会按天新建,旧文件永久堆积——这是日志体积失控的根源。
TP6 日志为什么越积越大?
默认 FileHandler 只支持 daily 分割,但不做任何清理:每天生成新文件(如 think-2026-07-07.log),旧文件一个不删。哪怕你只保留最近 3 天日志,think-2025-01-01.log 依然躺在那里。
- 不是“没轮转”,而是“只生不死”
-
php think clear是全量清空,会误删当天正在写的think-2026-07-08.log和有效缓存 - 没配
max_files或外部轮转时,几个月后runtime/log/占用 GB 级空间很常见
配置 Monolog RotatingFileHandler 实现按天+保留份数
必须切换驱动,否则无法控制保留数量。TP6 原生兼容 Monolog,但需手动注入 RotatingFileHandler 实例。
- 先装依赖:
composer require monolog/monolog(TP6 ≥ v6.0.13) - 在
config/log.php中把通道type改为'monolog' -
handler选项里用闭包返回实例,显式传参:new \Monolog\Handler\RotatingFileHandler($filename, $maxFiles = 30, $filePermission = null, true, new \DateTimeZone('Asia/Shanghai')) -
$maxFiles = 30表示最多保留 30 个日志文件(含当天),超出自动删最老的 - 别漏掉
new \DateTimeZone('Asia/Shanghai'),否则服务器时区错位会导致切割时间漂移
按大小切割必须关 buffer,否则切不准
想设单个日志不超过 5MB?RotatingFileHandler 需要实时感知文件体积,而 TP6 默认开启日志缓冲(buffer),会导致写满 6MB 还在往旧文件里写,直到 flush 才切——完全失效。
- 在
handler实例化时传第 4 个参数false关闭缓冲:new RotatingFileHandler(..., ..., ..., false) - 同时确保
max_size参数是字符串,如'5M'或'10485760'(字节数) - 不要混用
daily和max_size:RotatingFileHandler 二者可选其一,不能同时生效 - 若用
max_size,$maxFiles指的是最大保留文件数,不是天数
生产环境清理脚本必须跳过当天文件
自定义命令清理 runtime/log/ 时,直接 find ... -mtime +7 -delete 会误删正在写的当日日志(比如 think-2026-07-08.log),导致后续写入失败。
- 用
filemtime()判断修改时间,而非文件名匹配日期 - 过滤逻辑应为:
if (filemtime($file) - Linux 下注意
opcache.revalidate_freq可能缓存文件状态,清理前加clearstatcache(true, $file) - 日志文件名带
.log后缀,但 RotatingFileHandler 生成的归档是think-2026-07-07.log,不是think.log.1,匹配要写准
真正难的不是配参数,而是让切割时机、文件命名、清理边界三者对齐——时区错 1 小时,或少关一个 buffer,就可能让日志失控增长一周才被发现。


















