如何降低NotFoundHttpException的严重性?

Ada*_*sen 13 symfony

我希望在我的Symfony2应用程序中发生不良事件时收到警报.现在我只是ERROR在日志中寻找.不幸的是,"HTTP 404 - 找不到文件"(NotFoundHttpException)被记录为错误,"HTTP 403 - forbidden"(AccessDeniedHttpException)也是如此.

这不保证错误; 这些应该是警告.如何将这些日志设置为不太严重的级别?

示例错误:

[2012-07-02 16:58:21] request.ERROR: Symfony\Component\HttpKernel\Exception\NotFoundHttpException: No route found for "GET /foo" (uncaught exception) at /home/user/Symfony2_v2.0.12/vendor/symfony/src/Symfony/Bundle/FrameworkBundle/EventListener/RouterListener.php line 83 [] []
Run Code Online (Sandbox Code Playgroud)

Ada*_*sen 8

我找到了有用的东西.关于kernel.exeption事件Symfony2内部文档提到可以在事件上设置响应,并且GetResponseForExceptionEvent文档

一旦设置了响应,就会停止传播此事件.

我拼凑了一个看起来像我想要的听众:

<?php

namespace Acme\DemoBundle\Listener;

use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\HttpKernel\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\Event;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;

class ExceptionLoggingListener {
  private $logger;

  public function __construct(LoggerInterface $logger) {
    $this->logger = $logger;
  }

  public function onKernelException(GetResponseForExceptionEvent $event) {
    if(!$event) {
      $this->logger->err("Unknown kernel.exception in ".__CLASS__);
      return;
    }
    $notFoundException = '\Symfony\Component\HttpKernel\Exception\NotFoundHttpException';

    $e = $event->getException();
    $type = get_class($e);
    if ($e instanceof $notFoundException) {
      $this->logger->info($e->getMessage());
      $response = new Response(Response::$statusTexts[404], 404);
      $event->setResponse($response);
      return;
    }

    $accessDeniedException = '\Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException';
    if ($e instanceof $accessDeniedException) {
      $this->logger->info($e->getMessage());
      $response = new Response(Response::$statusTexts[403], 403);
      $event->setResponse($response);
      return;
    }
    $this->logger->err("kernel.exception of type $type. Message: '".$e->getMessage()."'\nFile: ".$e->getFile().", line ".$e->getLine()."\nTrace: ".$e->getTraceAsString());
  }

}
Run Code Online (Sandbox Code Playgroud)

  • 随机附注:你应该使用`instaceof`而不是`$ type ==='blah'`http://php.net/manual/en/internals2.opcodes.instanceof.php (2认同)

Tar*_*use 6

这是一种代码少的方法:)

1.扩展Symfonys ExceptionListner类并覆盖日志记录方法:

<?php

use Symfony\Component\HttpKernel\EventListener\ExceptionListener as BaseListener;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;


class ExceptionListener extends BaseListener
{

    /**
     * Logs an exception.
     *
     * @param \Exception $exception The original \Exception instance
     * @param string     $message   The error message to log
     * @param Boolean    $original  False when the handling of the exception thrown another exception
     */
    protected function logException(\Exception $exception, $message, $original = true)
    {
        $isCritical = !$exception instanceof HttpExceptionInterface || $exception->getStatusCode() >= 500;

        if (null !== $this->logger) {
            if ($isCritical) {
                $this->logger->critical($message);
            } else {

                if ($exception instanceof NotFoundHttpException) {
                    $this->logger->info($message);
                } else {
                    $this->logger->error($message);
                }
            }
        } elseif (!$original || $isCritical) {
            error_log($message);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

2.配置twig.exception_listener.class参数:

parameters:
    twig.exception_listener.class: "MyBundle\EventListener\ExceptionListener"
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,仍然使用2.1版本的每个人都将无法实现此方法,因为2.1版本的`ExceptionListener`类没有`logException`方法(https://github.com/symfony/symfony) /blob/2.1/src/Symfony/Component/HttpKernel/EventListener/ExceptionListener.php) (4认同)

Mas*_*one 5

只需添加excluded_404s到您的配置:

monolog:
    handlers:
        main:
            type:         fingers_crossed
            action_level: error
            handler:      nested
            excluded_404s:
                - ^/
        nested:
            type:  stream
            path:  "%kernel.logs_dir%/%kernel.environment%.log"
            level: debug
Run Code Online (Sandbox Code Playgroud)

请参阅http://symfony.com/doc/current/logging/monolog_regex_based_excludes.html以获取参考