如何在 Symfony Messenger 的中间件上禁用日志“信息”?

Posted

技术标签:

【中文标题】如何在 Symfony Messenger 的中间件上禁用日志“信息”?【英文标题】:How disable log "info" on middleware of Symfony Messenger? 【发布时间】:2020-06-14 21:44:43 【问题描述】:

如何禁用 Symfony Messenger 组件的SendMessageMiddleware 发送的INFO 类型的日志?

symfony/messenger/Middleware/SendMessageMiddleware.php

$this->logger->info('Received message class', $context);

https://github.com/symfony/messenger/blob/9c036a45bcf837dc38f0db93095a45a21096dd63/Middleware/SendMessageMiddleware.php#L57

【问题讨论】:

我的应用需要这个日志级别。也许这个日志记录应该是“调试”级别(在 SF 组件上)。那么,SF Messenger的频道可以单独记录吗?然后更改级别,例如'警告'级别,我该如何设置? 感谢您的帮助。我在我的处理程序中排除了“信使”频道,问题就解决了!简单的。 (monolog.yaml:channels: ["!messenger"]) 【参考方案1】:

我这样解决了我的问题:

monolog.yaml:

    ...
    channels: ["!messenger"]
    ...

【讨论】:

很好的解决方案! @Bruno Correa 是否可以将它们重定向到特定文件?? @famas23 使用流类型并设置保存日志文件的路径(文档:symfony.com/doc/current/…)【参考方案2】:

可以动态更改发送到 Monolog 的每个日志的日志级别。

要将 Symfony Messenger 的日志从当前的INFO 更改为例如DEBUG,您必须创建一个独白处理器。

该过程与 How to Add extra Data to Log Messages via a Processor 中的 Symfony 文档中解释的非常相似。

你必须像这样创建一个类:

<?php

namespace App\Monolog;

use Monolog\Logger;
use Monolog\Processor\ProcessorInterface;

class MessengerInfoToDebugLogLevel implements ProcessorInterface

    public function __invoke(array $record): array
    
        $channel = $record['channel'] ?? null;
        if (null === $channel) 
            return $record;
        

        if ('messenger' !== $channel) 
            return $record;
        

        $record['level'] = Logger::DEBUG;
        $record['level_name'] = Logger::getLevelName(Logger::DEBUG);

        return $record;
    

然后你将它注册为服务并用monolog.processor标记它:

# I put it here, but you can put it where you like most
# config/packages/dev/messenger.yaml

services:
    App\Monolog\MessengerInfoToDebugLogLevel:
        tags:
            -  name: monolog.processor 

现在messenger 的所有日志都降级为DEBUG 日志。

同样可以使用 Symfony HttpClient 来降级其日志消息(也位于 INFO):

<?php

namespace App\Monolog;

use Monolog\Logger;
use Monolog\Processor\ProcessorInterface;

class HttpClientInfoToDebugLogLevel implements ProcessorInterface

    public function __invoke(array $record): array
    
        $channel = $record['channel'] ?? null;
        if (null === $channel) 
            return $record;
        

        if ('http_client' !== $channel) 
            return $record;
        

        $record['level'] = Logger::DEBUG;
        $record['level_name'] = Logger::getLevelName(Logger::DEBUG);

        return $record;
    

然后你将它注册为服务并用monolog.processor标记它:

# I put it here, but you can put it where you like most
# config/packages/dev/http_client.yaml

services:
    App\Monolog\HttpClientInfoToDebugLogLevel:
        tags:
            -  name: monolog.processor 

此解决方案的灵感来自于 Matthias Noback 的“Dynamically changing the log level in Symfony apps”

【讨论】:

以上是关于如何在 Symfony Messenger 的中间件上禁用日志“信息”?的主要内容,如果未能解决你的问题,请参考以下文章

Symfony Messenger 如何确定应由哪个处理程序处理每种类型的消息?

Symfony messenger 和 mailer:如何添加 binding_key?

如何关闭 symfony messenger 组件的日志记录

如何避免在 Symfony Messenger 中处理来自“子”类的消息?

在 Symfony Messenger 组件中使用独立的发件人

如何使用 Behat 测试在多总线场景中调度 Symfony Messenger 事件?