代码之家  ›  专栏  ›  技术社区  ›  JimmyD

Logback不关闭dbappender的数据源连接

  •  2
  • JimmyD  · 技术社区  · 8 年前

    我们将logback1.1.7用于我们的一个web应用程序(托管在tomcat8上)。当我们使用Tomcat管理器停止web应用程序时,DBappender的数据连接没有关闭。我们需要重新启动完整的Tomcat服务来释放Logback的数据库连接。

    Tomcat连接池用于管理与数据库的连接。

    我们使用xml文件配置appender,如下所示:

        <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
    
        <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
            <connectionSource class="ch.qos.logback.core.db.JNDIConnectionSource">
                <jndiLocation>java:comp/env/jdbc/database</jndiLocation>
            </connectionSource>
        </appender>
    
        <root level="ALL">
            <appender-ref ref="DB" />
        </root>
    
    </configuration>
    

    在代码中,我们通过以下方式调用记录器:

    Logger logger = LoggerFactory.getLogger("defaultLogger");
    

    在停止应用程序时,有没有办法可以手动关闭Logback的连接?

    1 回复  |  直到 8 年前
        1
  •  1
  •   ideano1    8 年前

    <shutdownhook> 在您的配置中,您可以手动或自动关闭所有连接,也可以刷新所有异步日志记录。

    登录配置:

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

    你可以打电话来

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

    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();
    }