ThinkPHP文件日志要真正帮上忙,关键是确保error和critical级别真实落盘、trace开启以保留完整堆栈、runtime/log目录权限正确且属主匹配Web进程用户、CLI环境手动调用Log::save(),并确认log.php中default为file、channels.file.type首字母大写、close为false。

ThinkPHP 文件日志要真正帮上忙,关键不是“写了没”,而是“写得准、写得全、写得稳”。排查问题时最怕日志空、堆栈缺、时间乱、权限卡——这些都不是代码bug,全是配置和时机没对上。
确保 error 和 critical 级别真实落盘
很多线上问题卡在致命错误(如 parse error、memory exhausted)却查不到日志,是因为 PHP 的 fatal error 默认不走 Log::error(),而是触发 critical 级别。必须显式包含它:
- 在 config/log.php 中,'level' => ['error', 'critical'] ——不能只写 ['error'],也不能写成字符串如 'error,critical'
- 确认 'default' => 'file',且 'channels.file.type' => 'File'(首字母大写,小写会静默失败)
- 检查 'close' => false,设为 true 就等于关掉了整个日志通道
让堆栈完整、上下文可见
光有 [error] 一行字没用,得看到哪行代码、什么变量、什么异常类型。这靠 trace 开关控制:
- 在 config/log.php 中启用 'trace' => true(TP6.1+ 默认 false)
- 注意:该选项只对 error 和 notice 级别生效,info/debug 不带堆栈
- 临时排查期可开,长期开启会增大日志体积,建议配合 log rotation 使用
权限与路径必须一步到位
日志目录空着,90% 是权限或路径问题,不是配置没生效:
立即学习“PHP免费学习笔记(深入)”;
- 确认 runtime/log/ 目录存在,且属主是 PHP-FPM 实际运行用户(如 www-data 或 nginx),执行:chown -R www-data:www-data runtime/
- Linux 下权限设为 755(目录)、644(文件)足够,避免 777;Windows 需给 IIS_IUSRS 或 Users 写入权限
- 检查 'path' => runtime_path('log/') 是否明确指定,不要留空或写错相对路径
Web 和 CLI 场景区别对待
Web 请求结束自动 save,CLI 命令不会——这是日志丢失最隐蔽的原因之一:
- Web 环境:调用 Log::error() 后无需手动 save,框架会在响应结束时统一刷盘
- CLI 环境(如 php think command):必须在逻辑末尾加 Log::save(),更稳妥写法是 try-finally 包裹
- 若命令中途崩溃未捕获异常,Log::save() 不执行,已 record 的内容就丢了



















