我试图找出logback是否可能丢失消息。 从log4j2页面引用: “像Logback一样,Log4j 2可以在修改时自动重新加载其配置。与Logback不同,它会在不重新配置的情况下丢失日志事件”
那么,有人可以评论日志丢失日志事件吗?它真的发生了吗? (我已经看到使用Async appender可能会发生事件丢失,但是可以使用设置discardingThreshold 0来解决,但log4j2上的语句正在讨论配置重新加载) 我试图了解log4j2是否真的更可靠,或者我们只是使用logback ...
感谢。
答案 0 :(得分:2)
重新配置logback时,它会从记录器中删除所有appender引用和级别设置。然后它读取新配置并将其应用于记录器。在发生这种情况时,记录仍在继续。
Log4j 2将记录器与其配置分开。创建新配置后,记录器将指向新配置的LoggerConfig。因此,在短时间内,您将有一些记录器指向旧配置,一些记录器指向新配置,但它们永远不会被取消配置。
答案 1 :(得分:2)
我目前正在调查这个问题,看一下代码,看起来确实在重新配置过程中会丢失日志消息。 ReconfigureOnChangeFilter的ReconfiguringThread调用以下代码:
private void performXMLConfiguration(LoggerContext lc) {
JoranConfigurator jc = new JoranConfigurator();
jc.setContext(context);
StatusUtil statusUtil = new StatusUtil(context);
List<SaxEvent> eventList = jc.recallSafeConfiguration();
URL mainURL = ConfigurationWatchListUtil.getMainWatchURL(context);
lc.reset();
long threshold = System.currentTimeMillis();
try {
jc.doConfigure(mainConfigurationURL);
if (statusUtil.hasXMLParsingErrors(threshold)) {
fallbackConfiguration(lc, eventList, mainURL);
}
} catch (JoranException e) {
fallbackConfiguration(lc, eventList, mainURL);
}
}
在lc.reset()中,删除所有appender(以及其他配置属性),然后重新配置记录器上下文。没有明显的同步发生。
快速测试验证了重新配置期间消息丢失。