【问题标题】:Exclude all 404 errors from monolog从独白中排除所有 404 错误
【发布时间】:2017-07-08 17:26:15
【问题描述】:

目前我有独白在出现错误时向我发送电子邮件。我发现 404 错误只是污染了我的电子邮件,由于我自己发送的电子邮件数量,我的提供商最终暂停了我的帐户。我决定排除所有 404 错误,因为所有这些错误都是由于机器人寻找漏洞而不是来自客户端。

排除代码:

excluded_404s: - ^/

我现在看到的问题是,如果机器人使用 GET 以外的 http 方法,symfony 仍然会记录 404 错误。我的电子邮件现在被

之类的条目污染了

HEAD :80/phpmyAdmin/

如何排除所有 404 错误,包括使用 GET 以外的 http 方法的错误?

编辑: 好家伙。这里是初学者的错误。似乎在我上次部署配置后,我没有清除产品缓存,我发现配置已缓存。我正在使用部署器来部署我的代码更新,但我猜它缺少清除缓存命令。

【问题讨论】:

  • 你在这样做symfony.com/doc/current/logging/… 吗?
  • 更新了我的问题以包括排除 404 的设置。正如预期的那样,所有 GET 404 都被排除在外。不过,其他 http 方法仍会被记录。
  • 不确定它是否是一个错误,是否会尝试重现它.. 您可以使用不同的日志记录级别,即使用错误而不是调试。
  • 非常感谢。我正在使用 symfony 2.8。我在想我可能需要使用内核异常侦听器手动处理这些错误
  • 好吧,我不好意思说我错了。似乎我从生产中收到了所有 404 的电子邮件,但在开发中,配置有效。我猜还有更多测试。

标签: symfony http-status-code-404 monolog


【解决方案1】:

我知道这是一个老问题,但在谷歌搜索时这是第一个问题。 同时我找到了 symfony 3.4 的解决方案,如果您需要从日志中排除所有 404 错误,您可以创建一个 ExceptionListener 并检查异常是否为 NotFoundHttpException。 如果是这种情况,则只需返回响应,以便事件停止并且记录器不会处理异常。

src/AppBundle/EventListener/ExceptionListener.php

namespace AppBundle\EventListener;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

class ExceptionListener
{
    public function onKernelException(GetResponseForExceptionEvent $event)
    {
        $exception = $event->getException();
        if (! $exception instanceof NotFoundHttpException) {
            return;
        }
        $response = new Response($exception->getMessage(), $exception->getStatusCode());
        // returning a response stop the event propagation
        $event->setResponse($response);
    }
}

src/AppBundle/Resources/config/services.yml

services:
  app.exception.listener:
    class: AppBundle\EventListener\ExceptionListener
    tags:
      - { name: kernel.event_listener, event: kernel.exception }

【讨论】:

    【解决方案2】:

    Symfony 4.1。 upwords 可以配置为忽略 HTTP 代码:

    config/packages/monolog.yaml

    monolog:
        handlers:
            main:
                # ...
                type: 'fingers_crossed'
                excluded_http_codes: [404]
    

    https://symfony.com/blog/new-in-symfony-4-1-ignore-specific-http-codes-from-logs

    【讨论】:

      【解决方案3】:

      在 Symfony 4/5 中,您可以:

      <?php
      
      declare(strict_types=1);
      
      namespace App\EventListener;
      
      use Symfony\Component\HttpFoundation\Response;
      use Symfony\Component\HttpKernel\Event\ExceptionEvent;
      use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
      
      class ExceptionListener
      {
          public function onKernelException(ExceptionEvent $event)
          {
              $exception = $event->getThrowable();
              if ($exception instanceof NotFoundHttpException) {
                  $response = new Response($exception->getMessage(), $exception->getStatusCode());
                  $event->setResponse($response);
              }
      
              return;
          }
      }
      

      App\EventListener\ExceptionListener:
          tags:
              - { name: kernel.event_listener, event: kernel.exception }
      

      【讨论】:

        猜你喜欢
        • 2019-12-18
        • 1970-01-01
        • 2016-01-27
        • 2022-10-05
        • 2016-12-28
        • 1970-01-01
        • 2016-07-13
        • 2021-06-05
        • 2017-05-02
        相关资源
        最近更新 更多