【问题标题】:How disable log "info" on middleware of Symfony Messenger?如何在 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"])

标签: php symfony logging send 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 2015-11-14
    • 2022-11-29
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    • 2022-08-04
    相关资源
    最近更新 更多