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] %s', request()->fullUrl(), $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::channel('sql')->debug($message, $context); } }