Spring BootでLog4JDBCを使う方法というか、DataSource
のカスタマイズ方法。
Spring Boot 1.1.1.RELEASEで確認。この設定方法はバージョンアップの度に変わってきたから注意・・
import net.sf.log4jdbc.Log4jdbcProxyDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class AppConfig {
@Autowired
DataSourceProperties properties;
DataSource dataSource;
@ConfigurationProperties(prefix = DataSourceAutoConfiguration.CONFIGURATION_PREFIX)
@Bean(destroyMethod = "close")
DataSource realDataSource() {
DataSourceBuilder factory = DataSourceBuilder
.create(this.properties.getClassLoader())
.url(this.properties.getUrl())
.username(this.properties.getUsername())
.password(this.properties.getPassword());
this.dataSource = factory.build();
return this.dataSource;
}
@Bean
DataSource dataSource() {
return new Log4jdbcProxyDataSource(this.dataSource);
}
}
プロパティの設定方法は、通常のやり方と同じようにできるはず。
realDataSource()
の部分は普通にDataSource
を作成してもいいけど、DataSourceBuilder
を使うと
org.apache.tomcat.jdbc.pool.DataSource
com.zaxxer.hikari.HikariDataSource
org.apache.commons.dbcp.BasicDataSource
のうちクラスローダー上にあるものを使う。
最後にdataSource()
内(名前が重要)でLog4jdbcProxyDataSource
でくるんでやればOK。
pom.xmlには
<dependency>
<groupId>org.lazyluke</groupId>
<artifactId>log4jdbc-remix</artifactId>
<version>0.2.7</version>
</dependency>
を追加。
logback.xmlには
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<logger name="jdbc" level="OFF"/>
<logger name="jdbc.sqltiming" level="DEBUG"/>
<logger name="jdbc.resultsettable" level="ERROR"/><!-- ここはお好みで -->
</configuration>
こんな感じで設定しておけばOK。
JPAだけでなくDataSource
経由のすべてのSQLログを出力できるので開発中はかなり便利。
@Profile
つけて本番時は普通のDataSource
を返すようにすればいいかも。