src/EventListener/KernelOnTerminateListener.php line 58

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use App\Service\LoggerConfigurationService;
  4. use App\WsProxy\Subscriber\SoapCallCollectorSubscriber;
  5. use Psr\Log\LoggerInterface;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpFoundation\Response;
  8. use Symfony\Component\HttpKernel\Event\TerminateEvent;
  9. class KernelOnTerminateListener
  10. {
  11.     private LoggerConfigurationService $loggerConfigurationService;
  12.     private LoggerInterface $logger;
  13.     private LoggerInterface $metricsLogger;
  14.     private SoapCallCollectorSubscriber $soapCollector;
  15.     public function __construct(
  16.         LoggerConfigurationService $loggerConfigurationService,
  17.         LoggerInterface            $lsiGlobalLogger,
  18.         LoggerInterface            $metricsLogger,
  19.         SoapCallCollectorSubscriber $soapCollector
  20.     )
  21.     {
  22.         $this->loggerConfigurationService $loggerConfigurationService;
  23.         $this->logger $lsiGlobalLogger;
  24.         $this->metricsLogger $metricsLogger;
  25.         $this->soapCollector $soapCollector;
  26.     }
  27.     private function getRequestArray(Request $request): array
  28.     {
  29.         return [
  30.             'attributes' => $request->attributes->all(),
  31.             'request' => $request->request->all(),
  32.             'query' => $request->query->all(),
  33.             'server' => $request->server->all(),
  34.             'cookies' => $request->cookies->all(),
  35.             'headers' => $request->headers->all(),
  36.             'content' => $request->getContent(),
  37.             'pathInfo' => $request->getPathInfo(),
  38.             'getRequestUri' => $request->getRequestUri(),
  39.             'method' => $request->getMethod()
  40.         ];
  41.     }
  42.     private function getResponseArray(Response $response): array
  43.     {
  44.         return [
  45.             'headers' => $response->headers->all(),
  46.             'content' => $response->getContent(),
  47.             'statusCode' => $response->getStatusCode()
  48.         ];
  49.     }
  50.     public function onTerminateEvent(TerminateEvent $event): void
  51.     {
  52.         $this->logMetrics($event);
  53.         $this->logRequests($event);
  54.     }
  55.     private function logRequests(TerminateEvent $event): void
  56.     {
  57.         if (!$this->loggerConfigurationService->isEnabled('request_logger')) {
  58.             return;
  59.         }
  60.         $request $event->getRequest();
  61.         $routePath $request->getPathInfo();
  62.         $routeName $request->get('_route');
  63.         if ($this->loggerConfigurationService->isRoutePathEnabled($routePath'request_logger')
  64.             || $this->loggerConfigurationService->isRouteNameEnabled($routeName'request_logger')) {
  65.             $requestArray $this->getRequestArray($event->getRequest());
  66.             $responseArray $this->getResponseArray($event->getResponse());
  67.             $this->logger->debug('Request'$requestArray);
  68.             $this->logger->debug('Response'$responseArray);
  69.         }
  70.     }
  71.     private function logMetrics(TerminateEvent $event): void
  72.     {
  73.         if (!$this->loggerConfigurationService->isEnabled('metrics_logger')) {
  74.             return;
  75.         }
  76.         $request $event->getRequest();
  77.         $routePath $request->getPathInfo();
  78.         if ($this->loggerConfigurationService->isRoutePathEnabled($routePath'metrics_logger')) {
  79.             $reqMicroSecond = (int)($request->server->get('REQUEST_TIME_FLOAT')*1000);
  80.             $resMicroSecond = (int)(microtime(true)*1000);
  81.             $arMetrics = [
  82.                 'uri' => $request->getPathInfo(),
  83.                 'method' => $request->getMethod(),
  84.                 'controller' => $request->get('_route'),
  85.                 'req' => $reqMicroSecond,
  86.                 'res' => $resMicroSecond,
  87.                 'dur' => $resMicroSecond $reqMicroSecond,
  88.                 'soap' => [
  89.                     'calls' => [],
  90.                     'total_req' => 0,
  91.                     'total_time' => 0
  92.                 ]
  93.             ];
  94.             if($this->soapCollector->getCalls() !== []) {
  95.                 $arMetrics['soap']['total_req'] = count($this->soapCollector->getCalls());
  96.                 $arMetrics['soap']['total_time'] = (int)$this->soapCollector->getTotalTiming();
  97.                 foreach ($this->soapCollector->getCalls() as $call) {
  98.                     $arMetrics['soap']['calls'][] = [
  99.                         'method' => $call->getMethod(),
  100.                         'dur' => (int)$call->getTiming()
  101.                     ];
  102.                 }
  103.             }
  104.             $this->metricsLogger->debug(''$arMetrics);
  105.         }
  106.     }
  107. }