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

问题描述:

我正试图使用​​gelf格式将日志从symfony 2应用流式传输到graylog 2服务器。Graylog/Symfony2/Gelf:如何配置记录器以忽略错误?

我的独白配置如下所示:

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响应代码引起日志的请求)。

(另见这个问题:Prevent Internal Server Error with Symfony 2/Monolog on failed gelf connection

GELF-PHP提供了一个IngoreErrorTransportLogger,这似乎是建立这一确切目的。

我如何在Symfony的monolog配置中配置它?

事实证明,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