ThinkPHP6默认按日期分割日志,使用File驱动且single=false时自动生成runtime/log/Ymd/日.log目录结构;需确保APP_DEBUG=false、runtime/log/可写,禁用动态path中date()调用。

ThinkPHP6 默认就按日期分割日志文件,无需额外开启开关——只要使用默认的 File 驱动且未设置 'single' => true,它就会自动按年月日生成目录和文件。
确认基础配置启用日期分割
检查 config/log.php 中 channels.file 的关键项:
- type 必须是 'File'(不是 'monolog' 或其他)
-
single => false(默认值,设为 true 就会强制写入单个文件,如
think.log) -
path 可留空或指定为 runtime 下的相对路径,例如
'path' => 'log/';绝对路径也支持,但需确保 Web 进程有写权限
理解默认的日期路径规则
TP6 的 File 驱动内部调用 date('Ym') / date('d').log 拼接路径,所以:
- 2026年10月29日的日志会写入:
runtime/log/202610/29.log - 注意:不是
2026-10/29.log,默认用Ym格式(无横线),和部分文档写的2026-10不同 - 该目录结构由框架自动生成,但前提是
runtime/log/目录存在且可写
避免常见失效原因
明明配了却还是不按日期分?大概率卡在这几处:
立即学习“PHP免费学习笔记(深入)”;
-
APP_DEBUG=true:开发模式下错误直接输出到页面,几乎不写日志文件;线上必须设为
APP_DEBUG=false(.env 中写成APP_DEBUG=false,不能带空格或引号) -
runtime/log/ 不可写:Linux 下执行
chmod -R 755 runtime/,确认 Web 用户(如 www-data)有写权限;Windows 注意 IIS_IUSRS 权限 -
path 配了动态内容:比如
'path' => 'log/'.date('Ym').'—— PHP 配置文件只加载一次,date() 会被固化为首次启动时间,后续全写错目录,且框架不会报错
补充:想改成“年-月/日”格式怎么办?
原生 File 驱动不支持自定义日期格式,但可通过重写驱动实现。更推荐的做法是:
- 保持默认
202610/29.log格式,用监控脚本或日志收集器统一处理 - 如强需
2026-10/29.log,可继承think\log\driver\File,覆盖getFileName()方法,改用date('Y-m') . DS . date('d') . '.log' - 然后在
config/log.php中将type改为你的自定义类名(需自动加载支持)



















