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

Posted

技术标签:

【中文标题】如何关闭 symfony messenger 组件的日志记录【英文标题】:How to turn off logging for symfony messenger component 【发布时间】:2020-12-13 05:00:42 【问题描述】:

我有一个 Symfony 网站,它介于实际实现和登台之间(我的一个特殊客户使用它)。该服务器上的日志记录保持打开状态,因为这有助于在不时出现问题时提供帮助(并且它们经常以非明显、非错误/异常的方式出错)。大多数记录的行都是由 Doctrine 执行的查询,这对我来说非常有用,但是我确实手动禁用了一些巨大的、重复的和经过良好测试的操作的日志记录,这些操作会发送数百个查询,以使日志更易于导航,如果需要的话。

我的问题是:如何禁用从 Symfony Messenger 组件内部完成的日志记录?具体来说,由原则传输(我使用)完成的日志记录,它每秒向我的日志发送垃圾邮件(乘以我运行的 supervisord 进程的数量):

[2020-08-24 14:19:25] doctrine.DEBUG: "START TRANSACTION" [] []
[2020-08-24 14:19:25] doctrine.DEBUG: SELECT m.* FROM messenger_messages m WHERE (m.delivered_at is null OR m.delivered_at < ?) AND (m.available_at <= ?) AND (m.queue_name = ?) ORDER BY available_at ASC LIMIT 1 FOR UPDATE ["2020-08-24 13:19:25","2020-08-24 14:19:25","default"] []
[2020-08-24 14:19:25] doctrine.DEBUG: "COMMIT" [] []

由于这些消息是由原则生成的,我无法通过日志通道将它们过滤掉 - 因为这会禁用所有原则日志消息,这不是我想要的。我也不想将日志记录级别提高到比 DEBUG 更高的级别。我只想从日志中删除这些特定消息。

【问题讨论】:

当然,您可以通过频道原则过滤它们:channels: ['!doctrine'] 或将原则频道消息发送到不同的日志,以免弄乱您的“标准”日志。 另外,您可以提高日志级别以避免看到调试消息 - 或者您可以使用"fingers crossed" 仅在达到某个错误级别时记录所有内容。您必须更具体地说明您真正想要实现的目标? @LBA 抱歉,我已经稍微更新了我的问题以使其更清楚(英语不是我的第一语言 - 我以为我已经足够清楚了),但我只想禁用从 symfony 消息传递组件记录的原则日志消息。禁用整个学说日志记录通道绝对不是我想要的。也不是忽略所有调试级别的消息。 【参考方案1】:

我只是想解决这个问题,我发现大多数垃圾邮件都可以通过使用 Fingers_crossed 独白处理程序而不是默认处理程序来避免。这种快速解决方案避免完全禁用 Doctrine 日志。

packages/dev/monolog.yaml,替换

main:
    type: stream
    path: "%kernel.logs_dir%/%kernel.environment%.log"
    level: debug
    channels: ["!event"]

作者:

main:
    type: fingers_crossed
    action_level: info
    handler: nested
    channels: ["!event"]
nested:
    type: stream
    path: "%kernel.logs_dir%/%kernel.environment%.log"
    level: debug
    channels: ["!event"]

【讨论】:

这基本上会导致日志文件中的内容减少,但不幸的是,这不是问题所在。 所有 HTTP 请求都有一个或多个日志至少为 INFO 或更高级别,因此此配置不会更改任何内容。对于 messenger worker,大多数时候,它们只包含 Doctrine 调试日志,因此这种配置将避免那里的垃圾邮件。 啊,我明白了。这有点“侧身”,但看起来它会起作用,这才是最重要的。 是的,显然不是最好的解决方案,但这是我发现的最简单的解决方案,无需对信使/独白配置进行太多修改 我已经试过了。 Messenger工作人员为例如3600 秒,在此期间垃圾邮件 doctrine.DEBUG 每秒记录一次,但在处理消息时还有 messenger.INFO 记录,最后还有一个类似于“我正在停止”的消息。所以我将!messenger 添加到main 处理程序中,但为messenger 通道添加了另一个流处理程序以将它们保留在日志中而不触发main。最后,它对我不起作用,因为我有弃用的 INFO 消息,我无法在 symfony 4.4 上轻松删除这些消息。显然,5.1 中有一个“弃用”频道,所以我会在升级时再试一次。【参考方案2】:

你有很多选择。

排除 Messenger 日志信息: Disable Symfony Messenger log info

将您的消息记录在不同的文件中:

您可以将消息记录到不同的文件。就像在Symfony documentation 的这一部分中描述的那样。

配置记录器级别:

您可以使用级别信息配置您的记录器条目,这可以帮助您拥有与您想要查看的内容相对应的日志文件。例如,您可以使用ERROR 级别在您的消息中仅包含错误。

查看下面的文档Loggin component。

创建您自己的频道:

您可以创建自己的频道并订阅它,不包括doctrine。 Creating your own channel

grep搜索你想要的:

如果你想在阅读日志文件时过滤更多你想看到的内容,你可以使用grep like:

tail path/to/my/logfile.txt | grep 'want I want to see'

这使我们能够避免无用的行。 grep man page

【讨论】:

感谢您的回答,但这些解决方案都不适合我。将教义频道记录到不同的文件不会删除信使组件生成的垃圾邮件,只会使事件序列更难跟踪。提高错误级别不是我想要做的(如问题中所述),我确实希望保留大多数 DEBUG 级别的消息。排除整个学说频道也不是我想做的。最后,对文件进行 gerping 并不能回答我的问题,并且很难以仅删除其中一些消息的方式进行。 否则,您应该更深入地了解 Logger 组件,了解您不想要的东西是如何工作的,然后根据需要重写自己的组件。如果我理解得很好,您需要教义频道,而不是所有教义频道。这是一个频道,因此,您必须创建自己的频道并使用此频道并过滤您不想要的内容并使用您的自定义频道。 所交流的资源可以帮助实现这一目标。 请更新您的问题标题。这样可以避免混淆。 对不起,我不明白 - 我认为标题表达了我想要的 - 我想关闭 symfony messenger 组件的日志记录,即symfony.com/doc/4.4/messenger.html。此日志记录专门在教义频道上完成,但针对整个频道的任何解决方案都不好。理想情况下,有一种方法可以禁用来自 messenger 组件的所有日志记录,但似乎没有。

以上是关于如何关闭 symfony messenger 组件的日志记录的主要内容,如果未能解决你的问题,请参考以下文章

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

Symfony:我如何在 Messenger 中使用远程过程调用(RPC)?

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

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

Symfony messenger 和 mailer:如何添加 binding_key?

Symfony Messenger:重试延迟不适用于 Redis 传输