Laravel 输出执行的 SQL 日志

我们在使用Laravel框架时,免不了要打印一下程序中SQL的执行情况

临时输出执行的 SQL 日志

1
2
3
4
5
DB::enableQueryLog();// 开启日志支持

// 程序中执行SQL的代码

dd(DB::getQueryLog());// 输出执行的 SQL 日志

SQL 日志存放到log文件中

  1. app/Providers/EventServiceProvider.php 文件中 添加要注册的事件
1
2
3
4
5
6
7
8
9
10
11
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
//........
'Illuminate\Database\Events\QueryExecuted' => [
'App\Listeners\QueryListener',
],
];
  1. 进入cmd,在项目根目录里执行命令
1
php artisan event:generate

创建了 app/Listeners/QueryListener.php

  1. 编写QueryListener.php代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php

namespace App\Listeners;

use Illuminate\Database\Events\QueryExecuted;
use Illuminate\Support\Facades\Log;

class QueryListener
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}

/**
* Handle the event.
*
* @param QueryExecuted $event
* @return void
*/
public function handle(QueryExecuted $event)
{
if($event->sql)
{
$sql = str_replace("?", "'%s'", $event->sql);
$log = vsprintf($sql, $event->bindings);

Log::channel('sqllog')->info($log);
}
}
}

如果可以调用 Log::useFiles

可以使用如下代码,也无需理会第四步

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php

namespace App\Listeners;

use Illuminate\Database\Events\QueryExecuted;
use Illuminate\Support\Facades\Log;

class QueryListener
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}

/**
* Handle the event.
*
* @param illuminate.query $event
* @return void
*/
public function handle(QueryExecuted $event)
{
if($event->sql){
// 把sql 的日志独立分开
$fileName = storage_path('logs/sql/'.date('Y-m-d').'.log');
Log::useFiles($fileName,'info');
$sql = str_replace("?", "'%s'", $event->sql);
$log = vsprintf($sql, $event->bindings);
Log::info($log);
}

}
}
  1. config/logging.php文件添加 channel
1
2
3
4
5
6
7
8
9
'channels' => [
//.....

'sqllog' => [
'driver' => 'daily',
'path' => storage_path('logs/sqls/sql.log'),
'level' => 'info',
],
],
坚持原创技术分享,您的支持将鼓励我继续创作!
0%