Laravel 5.2中记录运行时 SQL
来源:互联网 发布:汉字笔顺查询软件 编辑:程序博客网 时间:2024/06/11 23:16
在开发过程中,我们有时候可能希望记录下程序执行的每一条 SQL,在 Laravel 中我们可以利用事件及其监听器很方便的实现这一需求。
本站之前曾发布过一篇相关的文章,不过是针对5.1及更老的版本,而在 Laravel5.2 中不再适用。所以就有了此文。
第一步:创建监听器
php artisan make:listener QueryListener --event=Illuminate\\Database\Events\\QueryExecuted
生成文件于 app/Listeners/QueryListener.php
第二步:注册事件
打开 app/Providers/EventServiceProvider.php
,在 $listen
中添加 illuminate.query
事件的监听器为 QueryListener
:
protected $listen = [ \Illuminate\Database\Events\QueryExecuted::class => [ QueryListener::class ], ];
当然在类前面你需要
use App\Listeners\QueryListener;
不然就报类不存在了。
第三步:添加逻辑
光有一个空的监听器是不够的,我们需要自己实现如何把 $sql 记录到日志中。为此,对 QueryListener 进行改造,完善其 handle 方法如下:
/** * Handle the event. * * @param QueryExecuted $event * * @return void */ public function handle($event) { if (env('APP_ENV', 'production') == 'local') { $sql = str_replace("?", "'%s'", $event->sql); $log = vsprintf($sql, $event->bindings); Log::info($log); } }
上面我们用到了 Log 门面,请注意在类开头引用,或者使用 \Log::info() 代替之。
至此大功告成,在调试模式下程序所执行的 SQL 都会被一一记录在案,方便我们调试。形式如下:
[2016-07-29 18:08:15] local.INFO: select * from `app_articles` where `app_articles`.`id` = '40' limit 1
可以看到,相对于5.1中的做法,本文中所诉的有不少变化。
首先,5.2中不再有 illuminate.query 等形式的框架事件标识,所以我们在注册事件及其监听器时需要使用真实的事件类名。
其次,5.2中事件监听器的 handle 方法只支持接收一个参数,此例中是一个\Illuminate\Database\Events\QueryExecuted 类型的对象,该对象中包含查询时的SQL、查询参数及查询时间等量,对于我们记录日志而言十分方便。
本文由本人编辑,首发于 http://laravel.so,转载装注明。
- Laravel 5.2中记录运行时 SQL
- Laravel 记录SQL日志
- Laravel 记录SQL日志
- laravel5.4监控sql并记录在laravel.log中
- laravel中经典sql语句!
- Spring Boot 中使用log4jdbc记录SQL的运行时参数
- 记录:获取 sql server 中job的运行状态
- Laravel 运行原生SQL时,Group by必须包含select字段的问题
- laravel 中获取执行的sql语句
- laravel中复杂的sql查询
- 监控SQL:执行表中所有sql语句、记录每个语句运行时间(3)
- laravel运行带有group by的sql时提示 “SQLSTATE[42000]: Syntax error or access violation: 1055 错误解决
- 记录学习laravel框架过程中遇到的问题
- Laravel中运行Gulp任务的利器 —— Laravel Elixir简介及入门教程
- laravel中把查询数据库的sql写入日志中
- laravel中打印sql语句到日志中
- mysql记录运行慢的sql
- 查看sql 作业明细及运行记录
- hdoj2717Catch That Cow
- C语言易忽视的错误
- 多项式求和
- SVD 详解 与 spark实战
- HDU--1233最小生成树之kruskal算法
- Laravel 5.2中记录运行时 SQL
- 用c++编写一段完整代码,要求判断一个进程(例如qq.exe)是否存在,若存在,输出存在,不存在就输出不存在。
- sdut oj1252 进制转换(栈)
- SPI
- 趣味100道C语言程序题num twelve
- hd 2717 Catch That Cow
- ARM汇编指令
- Linux mint/Ubuntu 如何修改主机名(亲测有效)
- 后缀数组 poj 3261