---
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には

    <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`を返すようにすればいいかも。
