0

上下文:在 Tomcat 中运行的 Java Web 应用程序,Log4j 2 版本 2.5。日志记录设置为使用Raven 连接器和一个 ELK(ElasticSearch + Logstash + Kibana)实例转到一个Sentry实例。

配置如下所示(匿名):

<configuration>
  <appenders>
    <Raven name="Sentry">
      <dsn>https://foo@bar.baz/1</dsn>
    </Raven>
    <Socket name="Logstash" host="1.2.3.4" port="1234">
      <SerializedLayout />
    </Socket>
  </appenders>
  <loggers>
    <root level="info">
      <appender-ref ref="Sentry" level="warn" />
      <appender-ref ref="Logstash" />
    </root>
  </loggers>
</configuration>

问题是,如果 Sentry 或 ELK 开始出现问题(响应时间长、无法访问……),应用程序线程在尝试记录时会被阻塞,应用程序实际上会死掉。

这个问题有首选的解决方案吗?某种断路器在这里是理想的:在检测到远程日志记录目标 Log4j 2 的问题后,将禁用附加程序一段时间。

我们使用另一个包装在 appender 中的<Async/>appender,但据我所知,这是一个很好的解决方案,可以使日志记录......好吧,异步,但不能解决无响应日志目标的问题。

4

1 回答 1

1

在我们的系统中,我们有一个名为 logs-forwarder 的特殊组件,它收集 log4j 和其他系统的所有日志,并将它们转发到 logstash / splunk 等可能有你的东西。所以这是一个有效的选择。

于 2017-06-12T14:58:43.720 回答