ThinkPHP6 默认日志文件名按日期生成(如20261029.log),需通过自定义processor闭包或继承File驱动重写getLogName方法实现动态命名,官方推荐优先使用processor方式。

ThinkPHP6 默认日志文件名是按日期生成的,比如 20261029.log,不带时间戳、不区分级别、不能自定义前缀。要修改命名规则,核心不是改文件名模板本身(TP6 没提供 filename_format 配置项),而是通过自定义日志通道 + 重写日志处理器(processor) 实现灵活控制。
一、理解 TP6 日志生成逻辑
TP6 的 File 日志驱动默认使用 think\log\driver\File,它把日志写入 path 目录下,按天切分,文件名为 Ymd.log(如 20261029.log)。这个行为由驱动内部硬编码决定,无法通过 config/log.php 直接配置文件名格式。
二、推荐方案:用 processor 动态控制日志路径和文件名
在 config/log.php 的 channels.file 配置中,通过 processor 闭包干预日志写入前的路径组装过程。这是官方支持、无侵入、可复用的方式。
- 打开
config/log.php - 找到
channels => ['file' => [...]]部分 - 添加或修改
processor项,返回一个包含filename键的数组:
'processor' => function($record) {
$date = date('Y-m-d_H-i'); // 自定义时间格式:2026-10-29_14-19
$level = strtolower($record['level_name']);
$filename = "app_{$date}_{$level}.log";
return ['filename' => $filename];
},
这样每条日志会写入独立文件(例如 app_2026-10-29_14-19_error.log),适合调试阶段或按级别隔离场景。
立即学习“PHP免费学习笔记(深入)”;
三、进阶:按模块/请求上下文动态命名
如果希望日志名体现当前模块或接口,可在 processor 中读取运行时信息:
- 检查是否在 HTTP 请求上下文中:
isset($_SERVER['REQUEST_URI']) - 获取当前控制器/方法(需配合 Request 或中间件预存)
- 拼接为
api_user_login_20261029_error.log类似结构
注意:processor 执行时机早于完整请求生命周期,建议将关键上下文(如 action 标识)提前存入 think\facade\Cache 或静态变量,再在此处读取。
四、替代方案:继承并扩展 File 驱动(适合长期项目)
若需彻底接管命名逻辑(如按小时切分 + 压缩归档 + 文件名含 PID),可新建类继承 think\log\driver\File,重写 getLogName() 方法:
- 创建
app\common\log\driver\CustomFile.php - 覆盖
getLogName(),返回$this->name ?: $this->getCustomFilename() - 在
config/log.php中将'type' => 'File'改为'type' => \app\common\log\driver\CustomFile::class
此方式更重,但可控性最强,适合有统一日志治理规范的团队。



















