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, ],