有時,咱們調試須要記錄用戶對數據庫的查詢記錄。mysql 免費版沒有這個功能,可是咱們能夠經過laravel 監聽事件(event)來達到目的php
第一步:經過命令新建文件mysql
php artisan make:listenter SqlQueryListener
第二步:編輯 新建的這個文件laravel
<?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設置sql
protected $listen = array( ................... 'Illuminate\Database\Events\QueryExecuted' => [ 'App\Listeners\QueryListener', ], );