Monolog:将错误发送到带有保留的低级日志记录的哨兵

Monolog: Send errors to Sentry with preserved lower-level log records

目标:

我想将所有 ERROR+ Monolog 记录连同较低级别的记录一起发送到 Sentry(以便于调试正在发生的事情)并且它们应该作为一个事件全部发送。

我有:

我有 Symfony4 应用 config/packages/prod/monolog.yaml:

monolog:
    handlers:
        # there is also fingers_crossed for file logging, but it is rather not related

        sentry_buffer:
            type: fingers_crossed
            action_level: error
            handler: sentry_transparent
            # ignore records logged by exception listener
            channels: ["!exceptions"]
        sentry_transparent:
            type: whatfailuregroup
            members: [sentry]
        sentry:
            type:  raven
            # Use Sentry client registered by SentryBundle
            client_id: sentry.client
            level: debug
            auto_log_stacks: true

我有创建 JSON 响应的自定义异常侦听器,但在发送它之前还将错误记录到 exceptions 通道(所以我在 fingers_crossed 处理程序中排除了这个通道,所以我不不会重复。

它在本地工作 - 仅当 Monolog 中出现 ERROR+ 记录时才会创建哨兵事件,并且所有收集的日志都附加在记录的上下文中。

在生产环境中,我们以某种方式得到了 info 级别的 maaaaaaany 事件,但它没有意义:

这些事件与任何错误无关,但在面包屑中我看到触发了一些弃用错误:

我试过用 trigger_error 重现这个,就像在 ProcessBuilder 中一样(来自面包屑),但无论我做什么,我的 Sentry 中都没有收到 INFO 事件。

这些事件来自长 运行 进程(排队消费者),但我执行了生产中的所有步骤(请求、处理队列),但我没有像在我们的生产实例中那样得到结果。

有什么建议吗?我怎样才能改进我们的配置来实现我们所需要的,同时又不向我们的 Sentry 发送我们不想要的事件?

解决方案是在 FingersCrossedHandlerWhatFailureGroupHandler 之间添加 BufferHandler:

sentry_wait_for_error:
    type:         fingers_crossed
    action_level: error
    handler:      sentry_buffer
    excluded_http_codes:
        4xx: ~
sentry_buffer: # All records must be sent at once!
    type:    buffer
    handler: sentry_failure_handler
sentry_failure_handler:
    type: whatfailuregroup
    members: [sentry]
sentry:
    type:  raven
    dsn: '%env(SENTRY_DSN)%'
    level: debug
    auto_log_stacks: true
    release: '%env(APP_VERSION)%'