我尝试使用gelf格式将日志从symfony 2应用程序流式传输到graylog 2服务器。
我的monolog配置如下:
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配置中配置它?
答案 0 :(得分:0)
事实证明,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: group
替换为type: whatfailuregroup
。
答案 1 :(得分:0)
您还可以在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)%'