<?php
namespace App\EventSubscriber;
use App\Util\FileUtils;
use Monolog\Handler\StreamHandler;
use Monolog\Logger;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class RequestSubscriber implements EventSubscriberInterface
{
private $logger;
public function onKernelController(ControllerEvent $event)
{
$request = $event->getRequest();
if(!str_contains($request->getRequestUri(), '.ico')) {
$this->getLogger()->info(sprintf("START %s: %s with %s", $request->getMethod(), $request->getRequestUri(), $request->getContent()));
}
}
public function onKernelResponse(ResponseEvent $event)
{
$request = $event->getRequest();
$response = $event->getResponse();
if ($response instanceof JsonResponse) {
$this->getLogger()->info(sprintf("FINISHED %s: %s with %s: Response - %s", $request->getMethod(), $request->getRequestUri(), $request->getContent(), $response->getContent()));
}
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::CONTROLLER => 'onKernelController',
KernelEvents::RESPONSE => 'onKernelResponse',
];
}
private function getLogger()
{
if(empty($this->logger)) {
$this->logger = new Logger('request');
$logDir = dirname(__DIR__, 2) . '/var/log/request/' . date('Y/m');
FileUtils::validateDirectory($logDir);
if('prod' == $_ENV['APP_ENV']) {
$level = Logger::INFO;
} else {
$level = Logger::DEBUG;
}
$logFile = $logDir . DIRECTORY_SEPARATOR . date('d') . '.log';
if (!is_file($logFile)) {
touch($logFile);
}
$this->logger->pushHandler(new StreamHandler($logFile, $level));
}
return $this->logger;
}
}