在配置重新加载时是否记录丢失消息?

时间:2016-01-28 15:51:14

标签: logback

我试图找出logback是否可能丢失消息。 从log4j2页面引用: “像Logback一样,Log4j 2可以在修改时自动重新加载其配置。与Logback不同,它会在不重新配置的情况下丢失日志事件”

那么,有人可以评论日志丢失日志事件吗?它真的发生了吗? (我已经看到使用Async appender可能会发生事件丢失,但是可以使用设置discardingThreshold 0来解决,但log4j2上的语句正在讨论配置重新加载) 我试图了解log4j2是否真的更可靠,或者我们只是使用logback ...

感谢。

2 个答案:

答案 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(以及其他配置属性),然后重新配置记录器上下文。没有明显的同步发生。

快速测试验证了重新配置期间消息丢失。