如何在开发环境中不显示symfony日志(monolog)中的404错误?

muk1a3rh  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(165)

我想在开发环境中为symfony日志进行配置,以便记录除404错误以外的所有消息。
我测试了以下配置:

monolog:
handlers:
    main:
        type: fingers_crossed
        action_level: error
        handler: nested
        excluded_http_codes: [404]
        buffer_size: 50

    nested:
        type: rotating_file
        path: "%kernel.logs_dir%/%kernel.environment%.log"
        level: debug
        channels: ["!event"]
        max_files: 30

在这种配置下,404消息不会出现在日志中,但问题是像“event.DEBUG”或“request.INFO”这样的消息也不会出现,而我希望它们出现,因为我是在开发环境中。
因此,我认为“action_level”太高,所以我对其进行了修改:

monolog:
handlers:
    main:
        type: fingers_crossed
        action_level: debug   <========== I replaced error with debug
        handler: nested
        excluded_http_codes: [404]
        buffer_size: 50

    nested:
        type: rotating_file
        path: "%kernel.logs_dir%/%kernel.environment%.log"
        level: debug
        channels: ["!event"]
        max_files: 30

现在在日志中,我可以看到“event.DEBUG”或“request.INFO”消息,但我也看到404错误...
这就像排除的_http_codes不起作用。
我的问题是,我如何才能在日志中不显示404错误,同时保留“event.DEBUG”或“request.INFO”之类的消息?
谢谢你(也为我的英语道歉)

nvbavucw

nvbavucw1#

您可以创建一个自定义的ErrorListener,它负责HTTP错误日志记录并覆盖默认的ErrorListener。在下面的代码中,dev环境由包含APP_DEBUG env变量的$this->debug属性确定。

namespace App\EventListener;

use Symfony\Component\HttpKernel\EventListener\ErrorListener as BaseErrorListener;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;

class ErrorListener extends BaseErrorListener
{
    protected function logException(\Throwable $exception, string $message, string $logLevel = null): void
    {
        if (null !== $this->logger) {
            if (null !== $logLevel) {
                $this->logger->log($logLevel, $message, ['exception' => $exception]);
            } elseif (!$exception instanceof HttpExceptionInterface || $exception->getStatusCode() >= 500) {
                $this->logger->critical($message, ['exception' => $exception]);
            } else {
                // beginning of changes
                if ($exception->getStatusCode() !== 404 || !$this->debug) {
                    $this->logger->error($message, ['exception' => $exception]);
                }
                // ending of changes
            }
        }
    }
}

并注册此侦听器

namespace App\DependencyInjection\Compiler;

use App\EventListener\ErrorListener;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Reference;

class ErrorListenerPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container): void
    {
        // override `exception_listener`
        $exceptionListenerDefinition = $container->getDefinition('exception_listener');
        $exceptionListenerDefinition->setClass(ErrorListener::class);
    }
}

相关问题