From 13e6b05ef39e9ecfccb892c5f7d17a68682b2e1f Mon Sep 17 00:00:00 2001 From: Jing Li Date: Wed, 19 Oct 2022 11:00:04 +0800 Subject: [PATCH] =?UTF-8?q?SQL=20=E6=89=A7=E8=A1=8C=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Providers/QueryLoggerServiceProvider.php | 67 ++++++++++++++++++++ config/app.php | 1 + 2 files changed, 68 insertions(+) create mode 100644 app/Providers/QueryLoggerServiceProvider.php diff --git a/app/Providers/QueryLoggerServiceProvider.php b/app/Providers/QueryLoggerServiceProvider.php new file mode 100644 index 0000000..f7c1c0a --- /dev/null +++ b/app/Providers/QueryLoggerServiceProvider.php @@ -0,0 +1,67 @@ +app['events']->listen([ + QueryExecuted::class, + TransactionBeginning::class, + TransactionCommitted::class, + TransactionRolledBack::class, + ], function ($event) { + Log::debug(match (true) { + $event instanceof TransactionBeginning => 'begin transaction', + $event instanceof TransactionCommitted => 'commit transaction', + $event instanceof TransactionRolledBack => 'rollback transaction', + default => $this->prepareSql($event), + }); + }); + } + + /** + * @param \Illuminate\Database\Events\QueryExecuted $query + * @return string + */ + protected function prepareSql(QueryExecuted $query): string + { + $sql = str_replace(['%', '?'], ['%%', '%s'], $query->sql); + + $bindings = $query->connection->prepareBindings($query->bindings); + + if (count($bindings)) { + $sql = vsprintf($sql, array_map([$query->connection->getPdo(), 'quote'], $bindings)); + } + + return sprintf('[%s] %s', $this->formatDuration($query->time), $sql); + } + + /** + * @param float $milliseconds + * @return string + */ + protected function formatDuration($milliseconds): string + { + return match (true) { + $milliseconds >= 1000 => round($milliseconds / 1000, 2).'s', + $milliseconds < 0.01 => round($milliseconds * 1000).'μs', + default => $milliseconds.'ms', + }; + } +} diff --git a/config/app.php b/config/app.php index 9e477f9..afd0b6b 100644 --- a/config/app.php +++ b/config/app.php @@ -193,6 +193,7 @@ return [ App\Providers\AuthServiceProvider::class, // App\Providers\BroadcastServiceProvider::class, App\Providers\EventServiceProvider::class, + App\Providers\QueryLoggerServiceProvider::class, App\Providers\RouteServiceProvider::class, ],