2017-06-12 61 views
0

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

配置看起来像这样(匿名):

<configuration> 
    <appenders> 
    <Raven name="Sentry"> 
     <dsn>https://[email protected]/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> 

问题是,如果哨兵或ELK开始演戏了(响应时间长,可达,...),应用程序线程被阻塞尝试登录和应用程序有效地死亡。

是否有解决此问题的首选方案?某种断路器在这里是理想的:在检测到远程日志记录目的地Log4j 2的问题后,会暂停该appender一段时间。

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

+0

值得注意的是,Sentry appender本身默认是完全异步的,所以它不应该备份你的记录器。 – Brett

+0

@Brett你能否澄清一下你的意思是哪个Sentry appender?我仍然使用旧的Raven appender,我知道我应该升级到Sentry,正如https://docs.sentry.io/clients/java/ – vektor

+0

中所提到的,即使使用传统的“raven-java”客户端,我们也默认为非常长时间的异步连接。你有没有证据表明哨兵延误会减慢你的采伐速度?他们绝对不应该 - 这将是一个错误。如果您有任何信息,请在Github上提出问题。谢谢! – Brett

回答

1

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