代码之家  ›  专栏  ›  技术社区  ›  Mike Schall

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

  •  13
  • Mike Schall  · 技术社区  · 14 年前

    我们正在从log4j迁移到logback,用于几个web应用程序。在关闭应用程序时,我们当前调用:

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

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

    迈克

    4 回复  |  直到 14 年前
        1
  •  8
  •   Sasha    9 年前

    <shutdownHook/> 进入配置应该停止上下文。

    logback docs

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

    来自 DelayingShutdownHook summary :

        2
  •  7
  •   David Roussel    14 年前

    这里有一个简单的方法:

    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();
    }
    
        3
  •  0
  •   Paul Gregoire    14 年前

    我不知道像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文件()是可用的,并且在内部执行一些相同的功能,但是我不使用它,所以我不能评论它是否比reset好。

        4
  •  0
  •   Sourabh    7 年前

    版本1.1.10以后,logback负责在停止或重新加载web应用时停止当前logback经典上下文。

    更新后的文件如下: https://logback.qos.ch/manual/configuration.html#webShutdownHook