在logback DBAppender中使用Spring dataSource

时间:2013-10-18 21:33:11

标签: spring datasource logback

我有一个使用Spring来设置连接池数据源的webapp,如下所示:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="${jdbc.driverClassName}" />
    <property name="jdbcUrl" value="${jdbc.url}" />
    <property name="user" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />

该应用程序还使用logback将事件直接记录到数据库。 Logback在带有DBAppender的logback.xml文件中配置:

  <appender name="eventsDB" class="ch.qos.logback.classic.db.DBAppender">
    <connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
      <dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <driverClass>${jdbc.driverClassName}</driverClass>
        <jdbcUrl>${jdbc.url}</jdbcUrl>
        <user>${jdbc.username}</user>
        <password>${jdbc.password}</password>
      </dataSource>
    </connectionSource>
  </appender>

正如您所看到的,我们正在设置dataSource两次,并且在每种情况下都需要单独的属性替换。简单地让Spring创建dataSource并将其传递给logback DBAppender会好得多。

有人能建议最好的方法吗?

1 个答案:

答案 0 :(得分:0)

一种选择是以编程方式将其配置为bean:

@Bean
public DBAppender dbAppender(DataSource dataSource){
    DBAppender dbAppender = new DBAppender();
    DataSourceConnectionSource connectionSource = new DataSourceConnectionSource();
    connectionSource.setDataSource(dataSource);
    connectionSource.start();
    dbAppender.setConnectionSource(connectionSource);
    dbAppender.start();

    LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
    Logger logger = loggerContext.getLogger("ROOT");
    logger.addAppender(dbAppender);

    return dbAppender;
}

这当然意味着它不会记录在创建此bean之前发生的任何事件。