/
ximain1
/
tpu-backend
Обзор
Документация
Войти
/
ximain1
/
tpu-backend
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
app/Http/Middleware/LogApiRequests.php
75 строк
3 KB
Попехин Константин Сергеевич
Корректное логирование в БД
05 янв 2026, 12:02
05 янв 2026, 12:02
43d3049
Код
Авторство
О чём код?
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; use Symfony\Component\HttpFoundation\Response; use Throwable; class LogApiRequests { /** * Handle an incoming request. * * @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next */ public function handle(Request $request, Closure $next): Response { return $next($request); } public function terminate(Request $request, $response) { try { $startTime = defined('LARAVEL_START') ? LARAVEL_START : microtime(true); $duration = round((microtime(true) - $startTime) * 1000); // Безопасно получаем сообщение об ошибке $errorMessage = null; // 1. Проверяем, есть ли исключение в самом ответе (если это Response со свойством exception) if (isset($response->exception) && $response->exception instanceof Throwable) { $errorMessage = $response->exception->getMessage(); } // 2. Если статус >= 400 и сообщения еще нет, берем текст статуса (например, "Not Found") elseif ($response->getStatusCode() >= 400) { $errorMessage = $response->statusText(); } $payload = $request->except(['password', 'password_confirmation', 'token']); DB::table('api_logs')->insert([ 'method' => $request->method(), 'url' => $request->fullUrl(), 'status_code' => $response->getStatusCode(), 'is_success' => $response->isSuccessful(), // Поле успешно/не успешно (true/false) 'duration_ms' => $duration, 'ip' => $request->ip(), 'user_agent' => $request->userAgent(), 'user_id' => $request->user()?->id, 'payload' => json_encode($payload), 'response_body' => mb_substr($response->getContent(), 0, 5000), // Ограничиваем размер 'error_message' => $errorMessage, ]); } catch (Throwable $e) { // Пишем в лог файла, если база данных недоступна или произошла ошибка при логировании Log::error('API Log Error: ' . $e->getMessage()); } } protected function formatResponse($response) { $content = $response->getContent(); // Если ответ слишком длинный (например, список из 1000 локомотивов), обрезаем if (strlen($content) > 10000) { return substr($content, 0, 10000) . '... [TRUNCATED]'; } return $content; } }