6
0
Fork 0
jiqu-library-server/app/Providers/QueryLogServiceProvider.php

99 lines
2.6 KiB
PHP

<?php
namespace App\Providers;
use Illuminate\Database\Events\QueryExecuted;
use Illuminate\Database\Events\TransactionBeginning;
use Illuminate\Database\Events\TransactionCommitted;
use Illuminate\Database\Events\TransactionRolledBack;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\ServiceProvider;
class QueryLogServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
if (! config('app.debug')) {
return;
}
$this->app['events']->listen([
QueryExecuted::class,
TransactionBeginning::class,
TransactionCommitted::class,
TransactionRolledBack::class,
], function ($event) {
if ($event instanceof TransactionBeginning) {
return $this->writeLog('begin transaction');
} elseif ($event instanceof TransactionCommitted) {
return $this->writeLog('commit transaction');
} elseif ($event instanceof TransactionRolledBack) {
return $this->writeLog('rollback transaction');
}
$this->writeLog($this->prepareSql($event));
});
}
/**
* 准备 SQL 语句
*
* @param \Illuminate\Database\Events\QueryExecuted $query
* @return string
*/
protected function prepareSql(QueryExecuted $query): string
{
$sql = str_replace(['%', '?'], ['%%', '%s'], $query->sql);
if (count($bindings = $query->connection->prepareBindings($query->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
{
if ($milliseconds < 0.01) {
return round($milliseconds * 1000) . 'μs';
} elseif ($milliseconds >= 1000) {
return round($milliseconds / 1000, 2) . 's';
}
return $milliseconds . 'ms';
}
/**
* 将消息记录到日志中
*
* @param string $message
* @param array $context
* @return void
*/
protected function writeLog($message, array $context = [])
{
Log::debug($message, $context);
}
}