<?php declare(strict_types=1);
namespace App\Framework\EventListener;
use Exception;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;
class LoggerEventListener
{
private LoggerInterface $logger;
public function __construct(LoggerInterface $logger)
{
$this->logger = $logger;
}
public function onRequest(RequestEvent $event): void
{
if ($event->getRequestType() !== HttpKernelInterface::MASTER_REQUEST) {
return;
}
$request = $event->getRequest();
$content = $request->getContent();
$this->logger->info('API Request Started', [
'body' => $content,
]);
}
public function onResponse(ResponseEvent $event): void
{
$response = $event->getResponse();
$extra = [
'status' => $response->getStatusCode(),
'body' => json_decode($response->getContent(), true),
];
$this->logger->info('API Request Ended', $extra);
}
public function onException(ExceptionEvent $event): void
{
$exception = $event->getThrowable();
$log = [
'type' => $exception::class,
'message' => $exception->getMessage(),
'called' => [
// 'file' => $exception->getTrace()[0]['file'],
// 'line' => $exception->getTrace()[0]['line'],
],
'occurred' => [
'file' => $exception->getFile(),
'line' => $exception->getLine(),
],
];
if ($exception->getPrevious() instanceof Exception) {
$log += [
'previous' => [
'message' => $exception->getPrevious()->getMessage(),
'exception' => $exception->getPrevious()::class,
'file' => $exception->getPrevious()->getFile(),
'line' => $exception->getPrevious()->getLine(),
],
];
}
$this->logger->error('Uncaught Exception: ' . json_encode($log));
}
}