使用logback关闭时是否需要刷新事件?

时间:2010-09-09 16:55:28

标签: java logback

我们正在从log4j迁移到几个Web应用程序的logback。在关闭我们的应用程序时,我们目前致电:

org.apache.log4j.LogManager.shutdown();

应该刷新所有异步日志记录并关闭所有外部资源(文件,套接字)。

在logback中是否存在类似的内容,或者在关闭时是否会以某种方式自动刷新?

麦克

4 个答案:

答案 0 :(得分:7)

这是一个简单的方法:

import org.slf4j.ILoggerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import ch.qos.logback.classic.LoggerContext;

...

ILoggerFactory loggerFactory = LoggerFactory.getILoggerFactory();
// Check for logback implementation of slf4j
if (loggerFactory instanceof LoggerContext) {
    LoggerContext context = (LoggerContext) loggerFactory;
    context.stop();
}

答案 1 :(得分:7)

似乎只需在配置中添加<shutdownHook/>即可停止上下文。

来自logback docs

<configuration>
   <!-- in the absence of the class attribute, assume 
   ch.qos.logback.core.hook.DelayingShutdownHook -->
   <shutdownHook/>
  .... 
</configuration>

来自DelayingShutdownHook summary

  

ShutdownHook实现,在指定的延迟后停止Logback上下文。默认延迟为0 ms(零)。

答案 2 :(得分:0)

我不知道像log4j这样的整体管理器关闭,但是当使用像这样的ServletContextListener销毁它们的上下文时,我关闭了所有单独的上下文记录器:

ContextSelector selector = StaticLoggerBinder.getSingleton().getContextSelector();
LoggerContext context = selector.detachLoggerContext(contextName);
if (context != null) {
    Logger logger = context.getLogger(Logger.ROOT_LOGGER_NAME);
    context.reset();
} else {
    System.err.printf("No context named %s was found", contextName);
}

此外,LoggerContext.stop()是可用的,并在内部执行一些相同的功能,但我不使用它,所以我不能评论它是否比重置更好。

答案 3 :(得分:0)

1.1.10版以后,当web-app停止或重新加载时,logback负责停止当前的logback-classic上下文。

此处有更新的文档:https://logback.qos.ch/manual/configuration.html#webShutdownHook