TP6.1日志写入异常主因是默认关闭trace和level自动fallback,必须显式配置level为数组(如['error'])、trace与record_trace双开关开启,且路径权限、用户归属、延迟写入机制均需校验。

日志写入异常不是配置没生效,而是 TP6.1 默认关掉了 trace 和 log.level 的自动 fallback,必须显式声明才记堆栈、才落盘。
为什么 APP_DEBUG=false 了还是没日志?
TP6.1 不再隐式启用 error 级别日志——哪怕 APP_DEBUG=false,只要 config/log.php 中没配 'level' => ['error'],框架就跳过整个日志写入流程。
- 检查
config/log.php是否有'level' => ['error', 'sql', 'notice'](必须是数组,'error'字符串会静默失效) - 确认
.env里是APP_DEBUG=false(等号前后不能有空格或引号),且没被config/app.php中的'app_debug' => true干扰(.env优先级更高) - 临时加一行
echo config('app.app_debug') ? 'on' : 'off';到入口文件,确保输出off
日志有文件但没堆栈、没行号、没上下文?
这是 trace 和 record_trace 双开关没开全。TP6.1+ 默认关闭这两个选项,和 TP6.0 行为不兼容。
- 在
config/log.php的'channels' => ['file' => [...]]块内,必须同时设:'trace' => true和'record_trace' => true -
'trace' => true只对error和notice级别生效,info级别即使开了也不带堆栈 - 开启后日志体积明显增大,线上建议仅排查期启用,避免磁盘撑爆
runtime/log/ 目录存在,但报 failed to open stream?
不是 ThinkPHP 配置问题,是 PHP-FPM 进程用户无权写入子目录或文件缺失。
立即学习“PHP免费学习笔记(深入)”;
- 执行
mkdir -p runtime/log确保路径完整(TP6.1 不再自动创建子目录) - 查 PHP-FPM 用户:
ps aux | grep php-fpm(常见为www-data或nginx) - 改归属:
chown -R www-data:www-data runtime(替换为你实际用户) - 权限用
755(目录)、644(文件)足够,777不安全且不解决根本问题
Log::record() 调用后没立刻生成日志?
TP6.1 日志默认延迟写入(请求结束时统一刷盘),Log::record() 只是入队,不是立即落盘。
- 确保调用发生在
App::init()之后(如控制器方法、中间件 handle 中),否则日志系统未加载 - 需立即验证,改用
Log::save()强制刷写;但注意频繁调用影响性能,仅调试用 - 自定义日志驱动(如数据库)时,
save()方法必须返回true,否则框架跳过后续处理
最易忽略的是 record_trace 必须放在 channels.file 配置块里,而不是顶层;放错位置等于没开。另外,TP6.1 对 level 类型校验更严格,字符串值会静默失败,这点和 TP6.0 完全不同。



















