商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > 如何利用ThinkPHP日志系统记录SQL执行语句【调试】

如何利用ThinkPHP日志系统记录SQL执行语句【调试】

  发布于2026-07-04 阅读(0)

扫一扫,手机访问

ThinkPHP调试利器:让SQL日志帮你揪出慢查询

日常开发中,数据库查询总是最容易被忽视但又最容易出问题的环节。ThinkPHP框架自带的日志系统其实是个好帮手,只要稍作配置,就能把每次执行的SQL语句原原本本地记录下来,这对排查慢查询、调试条件拼接特别有帮助。不过,默认情况下这块功能是藏起来的,需要手动去“激活”它。

如何利用ThinkPHP日志系统记录SQL执行语句【调试】

开启 SQL 日志记录

启动日志记录的第一步,是找到应用配置文件(通常在 app/config.phpconfig/database.php)。这里有几个关键开关需要确认:

  • 先把 debug 状态设为 true——这个全局调试开关是整个功能的基础。
  • 然后在数据库配置里加上 'log_sql' => true,部分旧版本还需要配合 'trace' => true 才能生效。
  • 日志驱动保持默认的 File 模式就行,不需要额外设置。

这些步骤做完,算是打下了基础,但日志系统还需要知道“要记录哪些类型”的信息。

配置日志级别与目标

SQL 日志属于单独的 sql 类型,需要在 config/log.php 里明确告诉日志系统:允许输出这个级别。配置时主要看这几个点:

  • 'level' => ['sql', 'error', 'info'] —— 必须显式把 sql 写进去,否则即使开启了也记不下来。
  • 确认 'type' => 'file',同时检查 'path' 目录(比如 runtime/log/)是否具备写权限。
  • 想单独管理 SQL 日志?可以加上 'single' => true,这样会自动生成独立的 sql.log 文件,方便直接查阅。

验证 SQL 是否被记录

配置完了怎么确认能跑起来?简单,执行一条数据库操作试试,比如 UserModel::find(1)。操作完成后,去 runtime/log/ 目录下翻翻:

  • 如果启用了 single 模式,直接打开 sql.log,应该能看到类似 [ SQL ] SELECT * FROM `user` WHERE `id` = 1 [ RunTime:0.0012s ] 这样的记录。
  • 没单独分离的话,就在 xxxx.log 文件里搜索 "[ SQL ]" 关键词。
  • 有一点要记住:只有在 debug=true 并且确实执行了查询时才会记录,空查询或者缓存命中的情况是不会被写入的。

进阶:自定义 SQL 日志格式或输出到控制台

如果觉得日志文件不够直观,想直接在开发环境的浏览器 Console 里查看,那就可以更进一步定制了。有几个方向可以尝试:

  • app/common.php 或者中间件里监听 Db::event('sql_explain') 事件,或者用 think\db\ConnectionsetLog() 方法注入自定义回调。
  • 手动记录也行:通过 think\facade\Log::write('sql', $sql) 把加工后的 SQL 写入日志。
  • 如果想搭配浏览器调试工具,可以用 console.log 输出到前端——前提是配合 Ajax 接口或者调试面板使用。

说起来其实不难,但有个细节容易被忽略:runtime/log 目录的写权限必须保证,否则配置再正确日志也无法生成。一旦开启,每次查询都会留下痕迹,这对分析慢 SQL、检视条件是否拼接正确来说,简直是肉眼可见的利器。

本文转载于:https://www.php.cn/faq/2752073.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注