上下文:在 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,但据我所知,这是一个很好的解决方案,可以使日志记录......好吧,异步,但不能解决无响应日志目标的问题。