<?php
namespace Cms\CoreBundle\EventListeners;
use Doctrine\DBAL\Exception\DriverException;
use Monolog\Logger;
use Psr\Log\LoggerInterface;
use Symfony\Component\Console\ConsoleEvents;
use Symfony\Component\Console\Event\ConsoleErrorEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\KernelEvents;
class ExceptionListener implements EventSubscriberInterface
{
/** @var Logger */
protected $logger;
/**
* ExceptionListener constructor.
* @param LoggerInterface $logger
*/
public function __construct(LoggerInterface $logger)
{
$this->logger = $logger;
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents(): array
{
return [
KernelEvents::EXCEPTION => ['onKernelException'],
ConsoleEvents::ERROR => ['onConsoleError'],
];
}
/**
* @param ExceptionEvent $event
*/
public function onKernelException(ExceptionEvent $event)
{
$exception = $event->getThrowable();
// skip logging of 404 exception
if ($exception instanceof NotFoundHttpException) {
return;
}
// skip logging of too many connections PDO exception
if ($exception instanceof DriverException
&& preg_match('/Too many connections/', $exception->getMessage()) === 1) {
return;
}
$this->logger->log(Logger::ERROR, $exception);
}
/**
* @param ConsoleErrorEvent $event
*/
public function onConsoleError(ConsoleErrorEvent $event)
{
$command = $event->getCommand();
$exception = $event->getError();
// skip logging of too many connections PDO exception
if ($exception instanceof DriverException
&& preg_match('/Too many connections/', $exception->getMessage()) === 1) {
return;
}
$message = sprintf(
'%s: %s (uncaught exception) at %s line %s while running console command `%s`.',
get_class($exception),
$exception->getMessage(),
$exception->getFile(),
$exception->getLine(),
$command ? $command->getName() : '',
);
$this->logger->log(Logger::ERROR, $message);
}
}