src/Cms/CoreBundle/EventListeners/ExceptionListener.php line 64

Open in your IDE?
  1. <?php
  2. namespace Cms\CoreBundle\EventListeners;
  3. use Doctrine\DBAL\Exception\DriverException;
  4. use Monolog\Logger;
  5. use Psr\Log\LoggerInterface;
  6. use Symfony\Component\Console\ConsoleEvents;
  7. use Symfony\Component\Console\Event\ConsoleErrorEvent;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  10. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  11. use Symfony\Component\HttpKernel\KernelEvents;
  12. class ExceptionListener implements EventSubscriberInterface
  13. {
  14.     /** @var Logger */
  15.     protected $logger;
  16.     /**
  17.      * ExceptionListener constructor.
  18.      * @param LoggerInterface $logger
  19.      */
  20.     public function __construct(LoggerInterface $logger)
  21.     {
  22.         $this->logger $logger;
  23.     }
  24.     /**
  25.      * {@inheritdoc}
  26.      */
  27.     public static function getSubscribedEvents(): array
  28.     {
  29.         return [
  30.             KernelEvents::EXCEPTION => ['onKernelException'],
  31.             ConsoleEvents::ERROR => ['onConsoleError'],
  32.         ];
  33.     }
  34.     /**
  35.      * @param ExceptionEvent $event
  36.      */
  37.     public function onKernelException(ExceptionEvent $event)
  38.     {
  39.         $exception $event->getThrowable();
  40.         // skip logging of 404 exception
  41.         if ($exception instanceof NotFoundHttpException) {
  42.             return;
  43.         }
  44.         // skip logging of too many connections PDO exception
  45.         if ($exception instanceof DriverException
  46.             && preg_match('/Too many connections/'$exception->getMessage()) === 1) {
  47.             return;
  48.         }
  49.         $this->logger->log(Logger::ERROR$exception);
  50.     }
  51.     /**
  52.      * @param ConsoleErrorEvent $event
  53.      */
  54.     public function onConsoleError(ConsoleErrorEvent $event)
  55.     {
  56.         $command $event->getCommand();
  57.         $exception $event->getError();
  58.         // skip logging of too many connections PDO exception
  59.         if ($exception instanceof DriverException
  60.             && preg_match('/Too many connections/'$exception->getMessage()) === 1) {
  61.             return;
  62.         }
  63.         $message sprintf(
  64.             '%s: %s (uncaught exception) at %s line %s while running console command `%s`.',
  65.             get_class($exception),
  66.             $exception->getMessage(),
  67.             $exception->getFile(),
  68.             $exception->getLine(),
  69.             $command $command->getName() : '',
  70.         );
  71.         $this->logger->log(Logger::ERROR$message);
  72.     }
  73. }