0x01 创建SQL监听器
Laravel 5.1版本:php artisan make:listener QueryListener --event=illuminate.query
Laravel 5.2、5.3、5.4版本:php artisan make:listener QueryListener --event=Illuminate\\Database\\Events\\QueryExecuted
0x02 注册SQL监听事件
Laravel 5.1版本:打开 app/Providers/EventServiceProvider.php,在 $listen 中添加 illuminate.query 事件的监听器为 QueryListener
头部引入 use App\Listeners\QueryListener;
protected $listen = [
'illuminate.query' => [
QueryListener::class,
],
];
Laravel 5.2、5.3、5.4版本:打开 app/Providers/EventServiceProvider.php,在 $listen 中添加 Illuminate\Database\Events\QueryExecuted 事件的监听器为 QueryListener
protected $listen = [
'Illuminate\Database\Events\QueryExecuted' => [
'App\Listeners\QueryListener',
],
];
0x03 编写SQL打印逻辑代码
Laravel 5.1版本
编辑app/Listeners/QueryListener.php文件/**
* 日志打印方法.
*
* @param illuminate.query $event
* @return void
*/
public function handle($sql, $params)
{
// 如果env中属于本地开发则进入该判断
if (env('APP_ENV', 'production') == 'local') {
foreach ($params as $index => $param) {
if ($param instanceof \DateTime) {
$params[$index] = $param->format('Y-m-d H:i:s');
}
}
$sql = str_replace("?", "'%s'", $sql);
array_unshift($params, $sql);
// dd($params);
\Log::info('SQL语句输出------------>'.call_user_func_array('sprintf', $params));
}
}
Laravel 5.2、5.3、5.4版本/**
* 日志打印方法.
*
* @param illuminate.query $event
* @return void
*/
public function handle(QueryExecuted $event)
{
if (env('APP_ENV', 'production') == 'local') {
$sql = str_replace("?", "'%s'", $event->sql);
$log = vsprintf($sql, $event->bindings);
Log::info($log);
}
}
0x04 查看效果
打开storage/logs/laravel.log可查看到所有的SQL语句[2017-05-14 00:43:22] local.INFO: select count(*) as aggregate from `data_users` where `status` = '1'
[2017-05-14 00:43:22] local.INFO: select * from `data_users` where `status` = '1' order by `addtime` desc limit 10 offset 0