Laravel中如何追踪SQL执行过程及监听数据库日志技巧分享?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1059个文字,预计阅读时间需要5分钟。
开发时想确认某段代码到底发生了什么SQL,最直接的方法是开启查询日志并手动触发发展打印——sqlDB::enableQueryLog();和sqlDB::getQueryLog();配合使用,但要注意它只对当前请求有效,默认是关闭的。
- 必须在查询前调用
DB::enableQueryLog(),否则日志为空 - 执行完要查的数据库操作后,立刻用
DB::getQueryLog()获取数组,里面每个元素是带query、bindings、time的关联数组 - 如果用了 Query Builder 或 Eloquent,它们都走底层
DB,所以能捕获;但原生 PDO 操作或直连不经过DB类的,不会记录 - 别在生产环境开这个,性能损耗明显,且可能泄露敏感参数(
bindings是原始值,没脱敏)
为什么 DB::listen() 没反应?常见配置漏项
DB::listen() 是事件监听方式,比手动启停日志更灵活,但它依赖 Laravel 的事件系统正常工作——很多人加了回调却看不到输出,基本是因为没注册到正确时机或环境不对。
本文共计1059个文字,预计阅读时间需要5分钟。
开发时想确认某段代码到底发生了什么SQL,最直接的方法是开启查询日志并手动触发发展打印——sqlDB::enableQueryLog();和sqlDB::getQueryLog();配合使用,但要注意它只对当前请求有效,默认是关闭的。
- 必须在查询前调用
DB::enableQueryLog(),否则日志为空 - 执行完要查的数据库操作后,立刻用
DB::getQueryLog()获取数组,里面每个元素是带query、bindings、time的关联数组 - 如果用了 Query Builder 或 Eloquent,它们都走底层
DB,所以能捕获;但原生 PDO 操作或直连不经过DB类的,不会记录 - 别在生产环境开这个,性能损耗明显,且可能泄露敏感参数(
bindings是原始值,没脱敏)
为什么 DB::listen() 没反应?常见配置漏项
DB::listen() 是事件监听方式,比手动启停日志更灵活,但它依赖 Laravel 的事件系统正常工作——很多人加了回调却看不到输出,基本是因为没注册到正确时机或环境不对。

