有時,我們調試需要記錄用戶對數據庫的查詢記錄。mysql 免費版沒有這個功能,但是我們可以通過laravel 監聽事件(event)來達到目的
第一步:通過命令新建文件
php artisan make:listenter SqlQueryListener
第二步:編輯 新建的這個文件
<?php
namespace App\Listeners;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Database\Events\QueryExecuted;
use Illuminate\Support\Facades\Log;
class SqlQueryListener
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* 記錄SQL查詢日志
*
* @param object $event
* @return void
*/
public function handle(QueryExecuted $event)
{
try {
if (env('API_DEBUG') == true) {
$sql = str_replace("?", "'%s'", $event->sql);
foreach ($event->bindings as $i => $binding) {
if ($binding instanceof DateTime) {
$event->bindings[$i] = $binding->format('\'Y-m-d H:i:s\'');
} else {
if (is_string($binding)) {
$event->bindings[$i] = "'$binding'";
}
}
}
$log = vsprintf($sql, $event->bindings);
$log = $log . ' [ RunTime:' . $event->time . 'ms ] ';
/*記錄sql查詢信息到日志,記錄日志並自定義位置*/
Log::useDailyFiles(storage_path('logs/job/error.log'));
Log::info($log);
} } catch (Exception $exception) { } } }
第三步:在providers目錄下EventServiceProvider設置
protected $listen = array(
...................
'Illuminate\Database\Events\QueryExecuted' => [
'App\Listeners\QueryListener',
],
);
