thinkphp日志按天分割默认生效,但仅在次日首次写入时创建新文件,而非零点即时切换;需确保daily=true且single=false,手动记录日志须显式传入业务时间戳。

ThinkPHP 日志按天分割为什么默认不生效
ThinkPHP 6 的 log.file 驱动默认开启 daily 分割,但很多人发现日志还是堆在 runtime/log/2024-05-12.log 里不动——不是没分割,是「当天的日志只写进一个文件,第二天才会切」。它不会在 00:00:00 瞬间新建文件,而是靠首次写入时间判定归属日期。
常见错误现象:2024-05-12.log 里混着 5 月 11 日 23:59 和 5 月 12 日 00:01 的日志;手动触发 php think optimize:log 也没用,因为该命令只优化日志目录结构,不强制切片。
- 确认配置是否启用:检查
config/log.php中'default' => 'file',且'file' => [... 'level' => ['error', 'info'], 'time_format' => 'c', 'daily' => true] -
'daily' => true必须配合'single' => false(否则强制单文件,覆盖 daily 行为) - 如果用了
'max_files' => 30,旧日志不会自动删除,只是不再写入——清理得另做
Linux crontab 清理旧日志的可靠写法
直接用 find runtime/log -name "*.log" -mtime +30 -delete 很危险:万一 runtime/log 下有子目录(比如调试生成的 sql/),或日志名含空格、特殊字符,-delete 可能误删或失败。
更稳妥的做法是先查再删,加时间边界和路径锁定:
0 2 * * * cd /var/www/myapp && find runtime/log -maxdepth 1 -name "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].log" -mtime +30 -print0 | xargs -0 rm -f
-
-maxdepth 1防止递归进子目录(如runtime/log/sql/) -
-name "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].log"精确匹配 ThinkPHP 默认的YYYY-MM-DD.log格式,避开sql.log或临时文件 -
-print0 | xargs -0处理文件名含空格或换行的情况 - 建议先用
-print测试一遍,确认列出的确实是目标文件
Log::record() 手动记录日志时如何对齐 daily 分割逻辑
用 Log::record() 写日志时,如果没指定日期,它会按当前时间戳决定写入哪个文件——但这个“当前时间”是调用时刻,不是日志业务发生时刻。比如凌晨 00:05 记录一条 23:58 的订单日志,它会被塞进 2024-05-13.log,而非 2024-05-12.log。
想严格按业务时间归档,必须显式传入时间戳:
Log::record('订单超时,ID: 12345', 'info', ['time' => strtotime('2024-05-12 23:58:00')]);
-
['time' => ...]参数会被FileHandler拿来生成文件名和内部格式化,不传则 fallback 到time() - 注意:这个时间戳只影响文件归属和日志行前缀,不影响
log.level过滤或max_files统计 - 如果大量使用业务时间记录,建议封装一个
BusinessLog::record()方法统一处理,避免漏传
自定义日志清理命令容易忽略的权限与路径问题
自己写个 think log:clean --days=30 命令看似干净,但线上常出问题:CLI 用户(如 www-data)没权限删 runtime/log 下的文件,或者命令里写的路径是相对路径,一到 crontab 就找不到 runtime 目录。
- 绝对路径必须写全:
app()->getRuntimePath() . 'log/',别用./runtime/log - 执行用户需对
runtime/log有rwx权限,推荐用chown -R www-data:www-data runtime+chmod -R 755 runtime - crontab 里不要用
~或$HOME,改用/var/www/myapp这类绝对路径 - 加一句
if (!is_writable($logDir)) { throw new Exception("Log dir not writable: $logDir"); },比静默失败好排查
归档和清理看着简单,真正稳住要卡住三个点:ThinkPHP 的 daily 判定时机、系统级定时任务的路径与权限上下文、业务日志时间戳的显式控制。少盯住一个,过两周就会发现磁盘告警又来了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











