Graylog / Symfony2 / Gelf:如何配置记录器以忽略错误?

Graylog / Symfony2 / Gelf: How to configure logger to ignore errors?

我正在尝试使用 gelf 格式将日志从 symfony 2 应用流式传输到 graylog 2 服务器。

我的独白配置如下:

monolog:
    handlers:
          # --- 8< ---
          # ...
          # --- >8 --- 
          graylog:
              type: gelf
              publisher:
                  hostname: my-graylog-server.com
                  port: 12201
              level: debug
              formatter: app.gelf_formatter

当 graylog 服务器不可用时,我收到(可以理解的)连接被拒绝错误

[2017-07-28 16:03:25] app.ERROR: Failed to write to socket: fwrite(): send of 153 bytes failed with errno=111 Connection refused (8) [] []

这会导致内部服务器错误(对导致日志的请求的 500 响应代码)。

(另请参阅此问题:

gelf-php 提供了一个 IngoreErrorTransportLogger,它似乎正是为此目的而构建的。

如何在 Symfony 的独白配置中配置它?

事实证明,Symfony 有 WhatFailureGroup 处理程序包装器,它忽略了它包装的所有日志记录处理程序的日志中的错误。

我们的配置现在看起来像这样,它只是在记录期间删除错误(可能不理想,但总比由于记录期间的错误而彻底失败要好)。

monolog:
    handlers:
          main:
              type:         fingers_crossed
              action_level: warning
              handler:      grouped
          grouped:
              type:         whatfailuregroup
              members:      [file, graylog]
          file:
              type:         stream
              path:         "%kernel.logs_dir%/%kernel.environment%.log"
              level:        debug
          graylog:
              type: gelf
              publisher:
                  hostname: my-graylog-server.com
                  port: 12201
              level: debug
              formatter: app.gelf_formatter

基本上我们用 type: whatfailuregroup 替换了 type: group

您还可以在 Graylog 中使用 UDP 传输。

首先你需要在 Graylog 中配置 GELF UDP 输入,然后这样配置:

monolog:
    handlers:
        # ...
        graylog:
            type: gelf
            publisher:
                id: gelf_publisher
            nested: true

services:
    gelf_publisher:
        class: Gelf\Publisher
        arguments:
            - '@gelf_transport'
    gelf_transport:
        class: Gelf\Transport\UdpTransport
        arguments:
            - '%env(GRAYLOG_HOSTNAME)%'
            - '%env(GRAYLOG_PORT)%'