src/EventSubscriber/RequestLoggingSubscriber.php line 43

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use Psr\Log\LoggerInterface;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Symfony\Component\HttpKernel\Event\RequestEvent;
  6. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  7. use Symfony\Component\HttpKernel\KernelEvents;
  8. use Symfony\Component\Security\Core\Security;
  9. class RequestLoggingSubscriber implements EventSubscriberInterface
  10. {
  11.     public function __construct(
  12.         private readonly LoggerInterface $logger,
  13.         private readonly Security $security,
  14.     ) {
  15.     }
  16.     public static function getSubscribedEvents(): array
  17.     {
  18.         return [
  19.             KernelEvents::REQUEST => ['onKernelRequest'100],
  20.             KernelEvents::RESPONSE => ['onKernelResponse', -100],
  21.         ];
  22.     }
  23.     public function onKernelRequest(RequestEvent $event): void
  24.     {
  25.         if (!$event->isMainRequest()) {
  26.             return;
  27.         }
  28.         $request $event->getRequest();
  29.         $requestId $request->headers->get('X-Request-Id');
  30.         if (!$requestId) {
  31.             $requestId bin2hex(random_bytes(8));
  32.         }
  33.         $request->attributes->set('_request_id'$requestId);
  34.         $request->attributes->set('_request_start'microtime(true));
  35.     }
  36.     public function onKernelResponse(ResponseEvent $event): void
  37.     {
  38.         if (!$event->isMainRequest()) {
  39.             return;
  40.         }
  41.         $request $event->getRequest();
  42.         $response $event->getResponse();
  43.         $requestId = (string) $request->attributes->get('_request_id''');
  44.         if ($requestId !== '') {
  45.             $response->headers->set('X-Request-Id'$requestId);
  46.         }
  47.         $start = (float) $request->attributes->get('_request_start'microtime(true));
  48.         $durationMs = (microtime(true) - $start) * 1000;
  49.         $user $this->security->getUser();
  50.         $userId $user && method_exists($user'getId') ? $user->getId() : null;
  51.         $this->logger->info('http_request', [
  52.             'request_id' => $requestId,
  53.             'method' => $request->getMethod(),
  54.             'path' => $request->getPathInfo(),
  55.             'status' => $response->getStatusCode(),
  56.             'duration_ms' => (int) round($durationMs),
  57.             'user_id' => $userId,
  58.             'ip' => $request->getClientIp(),
  59.         ]);
  60.     }
  61. }