开启thinkphp sql日志需同时满足三条件:app_debug=true、log.channels.trace.level包含'sql'、database.trigger_sql=true;缺一不可,否则runtime/log/trace/下无sql记录。

开启 ThinkPHP 的 SQL 日志记录,核心不是改某个“开关”,而是确保调试模式启用 + 日志驱动配置正确 + 查询监听机制生效。漏掉任意一环,thinkphp.log 里都看不到 SQL。
如何确认并强制开启调试模式
ThinkPHP 的 SQL 日志(包括查询语句、绑定参数、执行时间)只在 app_debug = true 时写入,且默认仅在命令行或 CLI 环境下输出到控制台——Web 请求下必须依赖日志文件。
-
APP_DEBUG必须为true,推荐在env文件中设置:APP_DEBUG=true - 不要只靠
config/app.php中的'debug' => true,它会被环境变量覆盖;优先检查.env - 若部署后仍不生效,用
var_dump(config('app.debug'))确认运行时值,避免服务器缓存了旧的配置
为什么开了调试模式却没 SQL 日志?查日志驱动配置
ThinkPHP 6+ 默认使用 trace 日志通道记录 SQL,但该通道需显式启用并指定日志级别。默认配置可能只记录 error 或 info,而 SQL 属于 sql 级别。
- 检查
config/log.php中'default' => 'file'是否生效,且'channels' => ['trace' => [...]]存在 -
trace通道必须包含'level' => ['sql', 'debug'],否则sql日志被过滤掉 - 确保
'path'指向可写的目录,比如runtime/log/;权限不足会导致静默失败,无报错
如何让每条查询都触发 SQL 日志?监听器必须注册
SQL 日志不是自动“捕获”的,而是由数据库事件监听器(think\db\event\Query)触发写入 trace 日志。如果项目禁用了事件或自定义了连接,监听器可能未加载。
- 确认
config/database.php中'trigger_sql' => true(TP6.1+ 默认开启,但低版本需手动设) - 检查是否误删了
app/provider.php中的think\db\Connection::class提供者,它负责注册查询监听器 - 若使用多数据库连接,每个连接实例都需独立启用监听:调用
$db->setTriggerSql(true) - 注意:事务内批量操作(如
insertAll)可能合并为单条 SQL,日志中只出现一次,不是漏记
快速验证 SQL 是否真的被记录
别只盯着 runtime/log/202405/xx.log 翻找,直接加一行测试代码最可靠:
Db::table('user')->where('id', 1)->find();
然后立刻查看 runtime/log/trace/ 下最新生成的 .log 文件(不是 xx.log),搜索 SELECT * FROM `user` 或 sql: 字样。如果这里没有,说明监听链路断在前几步;如果有但格式混乱(如参数没展开),可能是 bind 参数未被解析,需检查是否用了原生查询未传绑定数组。
复杂点在于:日志内容受 app.trace_sql 配置、log.channels.trace.level、数据库连接实例状态三者共同约束,任一环节被覆盖或关闭,SQL 就会消失——而这三个地方分散在不同配置文件里,很容易改了 A 忘了 B。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











