--- title: Spring BootでLog4JDBCを使う springboot tags: ["Log4JDBC", "Spring", "Spring Boot"] categories: ["Programming", "Java", "org", "springframework", "boot"] date: 2014-06-21T02:24:18Z updated: 2014-06-21T02:24:18Z --- 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); } } プロパティの設定方法は、[通常のやり方](http://docs.spring.io/spring-boot/docs/1.1.1.RELEASE/reference/htmlsingle/#common-application-properties)と同じようにできるはず。 `realDataSource()`の部分は普通に`DataSource`を作成してもいいけど、`DataSourceBuilder`を使うと * `org.apache.tomcat.jdbc.pool.DataSource` * `com.zaxxer.hikari.HikariDataSource` * `org.apache.commons.dbcp.BasicDataSource` のうちクラスローダー上にあるものを使う。 最後に`dataSource()`内(名前が重要)で`Log4jdbcProxyDataSource`でくるんでやればOK。 pom.xmlには org.lazyluke log4jdbc-remix 0.2.7 を追加。 logback.xmlには こんな感じで設定しておけばOK。 JPAだけでなく`DataSource`経由のすべてのSQLログを出力できるので開発中はかなり便利。 `@Profile`つけて本番時は普通の`DataSource`を返すようにすればいいかも。