ThinkPHP 8.0日志level配置不生效,90%因类型或大小写错误:必须为小写字符串数组(如['debug','info']),单字符串、大写或逗号分隔均被静默忽略。

日志级别配置不生效,90% 是因为 level 值类型或大小写错误,而不是“没配对”。ThinkPHP 8.0 要求它必须是小写字符串组成的数组,其他形式全被静默忽略。
level 必须是小写字符串数组,不是字符串或大写
常见错误现象:写了 'level' => 'debug,info,error' 或 'level' => 'info',结果 Log::debug() 不落盘、Log::info() 却刷屏;或者写了 'level' => ['Debug', 'Info'],日志完全不记录。
-
level只接受小写字符串数组,例如['debug', 'info', 'warning']✅ - 单字符串(如
'info')、逗号分隔字符串(如'debug,info')、大写(如'Debug')均无效 ❌ - 空数组
[]表示关闭该通道所有日志,慎用 - 级别名必须严格匹配:ThinkPHP 不识别
'INFO'、'Debug'、'notice'(注意notice是合法的,但容易拼错)
通道级 level 优先于全局 level,但通道必须先存在
你给某个通道单独配了 'level' => ['debug', 'info'],却没生效?大概率是这个通道压根没在 config/log.php 的 channels 数组里声明。
- 调用
Log::channel('pay')->info('xxx')前,必须确保'pay'是channels中的一个键,且其type首字母大写(如'File',不是'file') - 未定义的通道会 fallback 到
default通道,但它的level和你预期的不一致 - 运行时用
Log::extend()注册的通道,在 CLI/FPM/Swoole 多请求复用进程下极不稳定,不推荐用于生产 - 通道名建议全小写,避免和内置
'default'、'error'冲突
APP_DEBUG=true 时,很多日志根本不会触发
开发环境开着调试模式,Log::error() 可能有,但 Log::debug() 还是没内容?别急着改配置——先确认 APP_DEBUG 是否为 false。
立即学习“PHP免费学习笔记(深入)”;
- Fatal error、Parse error 等致命错误,只在
APP_DEBUG === false时由register_shutdown_function捕获并写入日志;设为true就直接渲染到页面,runtime/log/几乎为空 -
apart_level(如['sql'])强依赖app_debug = true,生产环境关掉 debug 后,SQL 日志自动失效 - 验证方式:加一行
echo config('app.app_debug') ? 'on' : 'off';,确认输出off -
.env文件中必须写成APP_DEBUG=false(无空格、无引号),Web 服务器需透传该变量
权限和驱动类型错误会导致“配置看似生效,实则静默丢弃”
你确认 level 写对了、通道也注册了、APP_DEBUG=false,但日志还是不出现?问题可能出在更底层:目录不可写,或驱动被悄悄切成了内存型。
-
runtime/log/目录及其所有父目录(包括runtime/)必须对 Web 进程用户(如www-data)可写,且每级都有x权限(否则无法进入路径) -
type值必须首字母大写:'File'✅,'file'❌(静默失败,日志不落盘) -
'type' => 'trace'或'test'是内存驱动,不写文件,仅用于调试面板或单元测试 - 用
Log::getLog()可查当前内存中所有未 flush 的日志条目,能帮你判断是“没生成”还是“没写出”
最易被忽略的是:ThinkPHP 启动时只读一次日志配置,改完 config/log.php 后,必须清空 runtime/cache/,否则旧缓存会让新配置不生效——尤其是改了 apart_level 或新增通道后。



















