上下文:在Tomcat中运行的Java Web应用程序,Log4j 2版本2.5。记录设置使用Sentry和一个ELK(ElasticSearch + Logstash + Kibana)实例转到一个Raven connector实例。
配置看起来像这样(匿名):
<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中的另一个appender,但据我所知,这是一个很好的解决方案来进行日志记录......好,异步,但不能解决无响应日志目标的问题。 / p>
答案 0 :(得分:1)
在我们的系统中,我们有一个名为logs-forwarder的特殊组件,它通过log4j和其他系统收集所有日志,并将它们转发给logstash / splunk等等。这是一个有效的选择。