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

Mik*_*all 15 java logback

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

org.apache.log4j.LogManager.shutdown();
Run Code Online (Sandbox Code Playgroud)

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

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

麦克风

Dav*_*sel 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();
}
Run Code Online (Sandbox Code Playgroud)


Sas*_*sha 7

似乎只是添加<shutdownHook/>到配置应该停止上下文.

来自logback docs:

<configuration>
   <!-- in the absence of the class attribute, assume 
   ch.qos.logback.core.hook.DelayingShutdownHook -->
   <shutdownHook/>
  .... 
</configuration>
Run Code Online (Sandbox Code Playgroud)

并且来自DelayingShutdownHook摘要:

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


Pau*_*ire 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);
}
Run Code Online (Sandbox Code Playgroud)

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