我们在项目Logback DBAppender中以编程方式创建:

    Logger logger = LoggerFactory.getLogger(loggerName);
    DBAppender dbAppender = new DBAppender();

    DataSourceConnectionSource connectionSource = new DataSourceConnectionSource();
    ComboPooledDataSource cpds = new ComboPooledDataSource();

    try {
        cpds.setDriverClass("oracle.jdbc.driver.OracleDriver");
        cpds.setJdbcUrl(dbConfig.getJdbcUrl());
        cpds.setUser(dbConfig.getUserID());
        cpds.setPassword(dbConfig.getPassword());
    } catch (PropertyVetoException e) {
        Logs.error("Unable to set driver class. PropertyVetoException: " + e);
    }

    connectionSource.setDataSource(cpds);
    connectionSource.setContext(logger.getLoggerContext());
    connectionSource.start();

    dbAppender.setConnectionSource(connectionSource);
    dbAppender.setContext(logger.getLoggerContext());
    dbAppender.start();

    logger.addAppender(dbAppender);


所以,我有一个问题-停止应用程序时是否需要关闭该连接源?

就像是:

  connectionSource.stop();
  dbAppender.stop();


还有一个问题。如果我有多个记录器-是否可以为所有记录器创建一个DBAppender?因为我注意到我们需要添加到dbAppender和connectionSource上下文,例如:

 connectionSource.setContext(logger.getLoggerContext());
 dbAppender.setContext(logger.getLoggerContext());


所有记录器的上下文是否都相同,我只需要从其中之一添加它?

最佳答案

从Logback v 1.1.0开始,由DBAppender打开的所有连接都代表您关闭。因此,只要使用的是Logback> = 1.1.0版本,就不必显式关闭DBAppender打开的任何连接。

重新这样:


  如果我有多个记录器-我可以为所有记录器创建一个dpappender吗?因为我注意到我们需要添加到dbAppender和connectionSource上下文,例如...


您不必为每个记录器调用这些行...

connectionSource.setContext(logger.getLoggerContext());
dbAppender.setContext(logger.getLoggerContext());


...由于每个记录器共享相同的LoggerContext,因此您仅应调用上述各行一次。

关于java - 关闭以编程方式创建的Logback DBAppender,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48520274/

10-12 18:12