如何在 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 中处理来自“子”类的消息?