thinkphp sql日志写入文件需同时满足三项数据库配置:'debug'=>true、'trigger_sql'=>true(tp6.1+)或'log_sql'=>true(旧版)、'logger'=>['sql'=>true],并确保log.php中sql通道配置正确且目录可写。

要让 ThinkPHP 的 SQL 日志真正写入文件、可查可用,关键不是“开了没”,而是配置链路是否完整打通。常见情况是明明设置了 app_debug=true,日志目录里却空空如也——问题往往出在数据库配置文件(config/database.php)中几个容易被忽略的开关上。
database.php 必须启用的三项配置
ThinkPHP 6+ 中,SQL 日志能否落地,直接取决于数据库连接层是否触发了监听事件。以下三项必须同时为 true,缺一不可:
-
'debug' => true:开启数据库调试模式,这是监听器加载的前提; -
'trigger_sql' => true(TP6.1+)或'log_sql' => true(旧版):显式启用 SQL 执行事件触发,否则db_query等事件根本不会广播; -
'logger' => ['sql' => true](TP6.1+):告诉连接实例将 SQL 交由日志系统处理,否则即使监听到也不会落盘。
区分日志通道与路径配置
SQL 日志默认不走主日志通道(default),而是写入独立的 sql 通道(TP6)或 trace 通道(部分版本)。需确认:
-
config/log.php中存在'channels' => ['sql' => [...]]或'trace' => [...]配置; - 该通道的
'path'指向runtime/log/sql/或runtime/log/trace/,且目录可写; - 通道的
'level'明确包含'sql',例如:'level' => ['sql', 'error']。
多数据库连接时的常见遗漏
若项目使用多个数据库连接(如 mysql2、redis_db),每个连接都需单独配置 trigger_sql 和 logger。不能只配默认连接:
- 检查
database.php中各连接数组是否都含'trigger_sql' => true; - 调用非默认连接时,需显式初始化:
Db::connect('mysql2')->table('user')->select(); - 避免用
Db::name('user', '', 'mysql2')这类简写,它可能绕过连接实例的完整配置加载。
快速验证配置是否生效
别等请求完再翻日志文件,用最简方式当场验证:
- 在控制器中加一行测试查询:
Db::table('user')->limit(1)->find();; - 立刻检查
runtime/log/sql/(或trace/)下最新生成的.log文件; - 搜索
[ sql ]或SELECT字样,有则说明配置通;无则说明某环节断开(优先查trigger_sql和logger.sql是否漏设)。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











