Log4j 2的断路器

时间:2017-06-12 14:22:23

标签: java log4j2 elastic-stack sentry circuit-breaker

上下文:在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>

1 个答案:

答案 0 :(得分:1)

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