thinkphp 6+ 默认日志不按模块分类,需自定义 modulefile 类动态生成模块子目录;cli 命令需手动指定模块名,部署前须检查 runtime/log 目录权限并确保可写。

日志路径配置在 app.php 的 log 项里
ThinkPHP 6+ 默认把所有日志写进 runtime/log/,不区分模块。要按模块分类,得手动改日志通道的 path 配置,不是靠目录自动拆分——它不会自己识别控制器名或路由来建子目录。
实操建议:
- 打开
config/app.php,找到'log' => [...]块 - 修改
'default' => 'file'对应的file通道定义(通常在config/log.php) - 把
'path' => runtime_path() . 'log/'改成动态路径,比如'path' => runtime_path() . 'log/' . app()->http->getName() . '/'(适用于多应用模式) - 单应用但需按模块分:用
think\facade\App::module()或请求上下文提取模块名,再拼进路径(见下一条)
按模块名动态生成日志子目录需重写 FileHandler
原生 FileHandler 不支持运行时插值路径,直接写 log/{:module}/ 这类占位符无效,会当成字面目录名创建,导致日志全塞进叫“{:module}”的文件夹里。
实操建议:
- 复制
think\log\driver\File到app\common\log\driver\ModuleFile - 重写
getMasterLogFile()方法,在返回前插入模块判断逻辑,例如:protected function getMasterLogFile(): string { $module = app('http')->getName() ?: (app()->request->module() ?: 'common'); $this->config['path'] = rtrim($this->config['path'], '/') . '/' . $module . '/'; return parent::getMasterLogFile(); } - 在
config/log.php中将'default'指向这个新类:'default' => 'module_file',并注册驱动:'module_file' => \app\common\log\driver\ModuleFile::class
log.level 和 log.file_size 会影响模块日志的轮转行为
模块子目录一旦建起来,每个目录下的日志文件独立轮转。如果全局设了 'file_size' => 2097152(2MB),那 admin/ 和 api/ 各自满 2MB 就切,互不影响——这看起来合理,但容易忽略磁盘占用翻倍风险。
实操建议:
- 避免给每个模块配过大的
file_size,尤其高频写入模块(如支付回调),建议压到1048576(1MB)以内 -
log.level若设为'error',模块目录下只会生成error.log;若为'debug',则每个模块都有debug.log、sql.log等多个文件,目录结构变深,清理脚本要适配 - 别在
log.close为true时调试路径——日志根本不会落地,你看到的“没生成模块目录”其实是压根没写
CLI 命令和定时任务的日志模块名常为空,需显式指定
HTTP 请求能通过 Request::module() 拿到模块名,但 php think hello 这类命令行调用,app()->request->module() 返回空字符串,结果所有 CLI 日志全堆进 log//(双斜杠路径),甚至报错。
实操建议:
- 在自定义
ModuleFile的getMasterLogFile()里加兜底:$module = $module ?: 'console' - 更稳妥的做法:在命令类的
handle()开头手动绑定模块标识,例如:app()->instance('log_module', 'task');,然后在日志处理器里优先读取该实例 - 检查
think\console\Command是否被继承时覆盖了initialize()导致 request 初始化异常——这也是模块名为空的隐藏原因
mkdir 权限检查,尤其是 Docker 容器或宝塔部署时,runtime/log/admin 目录可能因父目录权限不足无法自动创建,日志静默丢失。动手前先 php think build:log-dir(可手写一个简单命令)确保各级目录存在且可写。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











