Я получаю много NotFoundHttpException и AccessDeniedExceptions в моих журналах symfony2. Как перенести их в другой файл (и не смешивать со всеми другими журналами на моей машине).
Во-первых, создайте прослушиватель событий исключения, подобный этому (заимствованный из ответа здесь , но измененный для перехода на контроллер ветви, как обычно, – получил этот код из ExceptionListener от Symfony):
class AnnoyingExceptionListener { private $logger; public function __construct(LoggerInterface $logger) { $this->logger = $logger; } public function onKernelException(GetResponseForExceptionEvent $event) { static $handling; if (true === $handling) { return false; } $handling = true; $exception = $event->getException(); $request = $event->getRequest(); $type = get_class($exception); if(!$event) { $this->logger->err("Unknown kernel.exception in ".__CLASS__); return; } $notFoundException = '\Symfony\Component\HttpKernel\Exception\NotFoundHttpException'; $accessDeniedException = '\Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException'; if ($exception instanceof $notFoundException) { $this->logger->info($exception->getMessage()); } else if ($exception instanceof $accessDeniedException) { $this->logger->info($exception->getMessage()); } else { $this->logger->err("kernel.exception of type $type. Message: '". $exception->getMessage()."'\nFile: ". $exception->getFile().", line ". $exception->getLine()."\nTrace: ". $exception->getTraceAsString()); } $attributes = array( '_controller' => 'Symfony\Bundle\TwigBundle\Controller\ExceptionController::showAction', 'exception' => FlattenException::create($exception), 'logger' => $this->logger, 'format' => $request->getRequestFormat(), ); $request = $request->duplicate(null, null, $attributes); $request->setMethod('GET'); try { $response = $event->getKernel()->handle($request, HttpKernelInterface::SUB_REQUEST, true); } catch (\Exception $e) { $message = sprintf('Exception thrown when handling an exception (%s: %s)', get_class($e), $e->getMessage()); if (null !== $this->logger) { if (!$exception instanceof HttpExceptionInterface || $exception->getStatusCode() >= 500) { $this->logger->crit($message); } else { $this->logger->err($message); } } else { error_log($message); } // set handling to false otherwise it wont be able to handle further more $handling = false; // re-throw the exception from within HttpKernel as this is a catch-all return; } $event->setResponse($response); $handling = false; }
Затем создайте следующие записи service.yml:
failedRequestStreamHandler: class: Monolog\Handler\StreamHandler arguments: - %kernel.logs_dir%/failed_requests.log - debug failedRequestLogger: class: Symfony\Bridge\Monolog\Logger arguments: ['failedRequests'] calls: [[ pushHandler, [@failedRequestStreamHandler] ]] kernel.listener.annoying_exception_listener: class: TMD\SharedBundle\Listener\AnnoyingExceptionListener arguments: [@failedRequestLogger] tags: - { name: kernel.event_listener, event: kernel.exception, method: onKernelException }
Немного раздутый, но это Symfony2 для тебя.
Для получения информации от Symfony >= 2.2
вам необходимо воспользоваться услугой:
$e = $event->getException(); $notFoundException = '\Symfony\Component\HttpKernel\Exception\NotFoundHttpException'; if ($e instanceof $notFoundException) { // Log the error $this->pageNotFoundLogger->info($e->getMessage()); /** @var ExceptionController $exceptionController */ $exceptionController = $this->container->get('twig.controller.exception'); $request = $event->getRequest(); $response = $exceptionController->showAction($request, FlattenException::create($e), $this->logger, $request->getRequestFormat()); $event->setResponse($response); $event->stopPropagation(); return; }
В этом примере я использую контейнер для получения услуги, но вы лучше передаете эту услугу непосредственно в свой service.yml
.