我正在尝试使用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
当灰色日志服务器不可用时,我收到(可以理解的(连接被拒绝错误
[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 响应代码(。
(另请参阅此问题:使用Symfony 2防止内部服务器错误/gelf连接失败时的Monolog(
gelf-php提供了一个IngoreErrorTransportLogger,它似乎是为此目的而构建的。
如何在Symfony的单日志配置中配置它?
事实证明,SymfonyWhatFailureGroup
处理程序包装器一个处理程序,该处理程序忽略了它包装的所有日志记录处理程序日志中的错误。
我们的配置现在看起来像这样,它只是在日志记录期间丢弃错误(可能不理想,但比由于日志记录期间的错误而直接失败要好(。
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: GelfPublisher
arguments:
- '@gelf_transport'
gelf_transport:
class: GelfTransportUdpTransport
arguments:
- '%env(GRAYLOG_HOSTNAME)%'
- '%env(GRAYLOG_PORT)%'