SQL日志启用需同时满足app_debug为true且log.level包含'sql',二者缺一不可;配置错误如缺少'sql'或app_debug为false均导致SQL不记录,验证需检查日志文件中是否存在[sql]前缀的记录。

因为 ThinkPHP 5.1 中 SQL 日志的记录不取决于 log.level 是否包含 debug,而是严格依赖两个硬性条件:app_debug 必须为 true,且 log.level 必须显式包含 'sql'。
SQL 日志触发有独立开关
TP5.1 的日志系统对 SQL 记录做了特殊处理:它不走通用日志级别(如 debug/info/warning)的过滤逻辑。即使你把 log.level 设成 ['debug', 'info', 'sql'],只要 app_debug => false,SQL 就完全不会进日志;反过来,哪怕 log.level 只有 ['sql', 'error']、没写 debug,只要 app_debug => true,SQL 依然会记录。
-
app_debug = true是前提——生产环境关闭后,框架直接跳过所有 SQL 收集逻辑 -
log.level中必须有字符串'sql',不是靠debug“覆盖”或“隐含”触发 - 配置位置通常在
config/log.php或通过环境变量/多环境配置生效
常见配置错误示例
以下写法都不会记录 SQL:
-
'log' => ['level' => ['debug', 'info']]—— 缺少'sql' -
'app_debug' => false即使 log.level 包含 sql —— 调试模式关了,SQL 收集模块不启动 - 在
.env里写了APP_DEBUG=false,但 config/app.php 里又设为 true ——.env优先级更高,实际仍为 false
正确配置方式
确保以下两点同时满足:
- 在
config/app.php或.env中开启调试:app_debug => true或APP_DEBUG=true - 在
config/log.php中明确声明:'level' => ['sql', 'error'](开发期可加'notice',但'sql'不可少) - 数据库配置(
config/database.php)无需额外设log => true,那是 TP6 的写法,TP5.1 不识别
验证是否生效
写一段简单查询后,立刻检查 runtime/log/年-月/日.log 文件内容:
- 看到类似
[ sql ] SELECT * FROM user WHERE id = ? [ 0.12ms ]的行,说明 SQL 日志已启用 - 如果只有
[ error ]或[ notice ]没有[ sql ],回头确认app_debug和log.level两项 - 注意:日志写入有缓冲,可在查询后加
Log::save();强制刷盘,避免因请求结束太快而丢失

















