94 lines
2.4 KiB
PHP
94 lines
2.4 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 语句
|
|
*/
|
|
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
|
|
*/
|
|
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
|
|
* @return void
|
|
*/
|
|
protected function writeLog($message, array $context = [])
|
|
{
|
|
Log::debug($message, $context);
|
|
}
|
|
}
|