S2JDBC経由で発行されたSQLを確認する方法【全SQL編】

前回は、S2JDBC経由で発行されたSQLを個別に確認する方法を紹介した。
今回は、S2JDBC経由で発行された全てのSQLをログファイルに出力することで、確認する方法を紹介する。

前回の方法を、SQLを実行する全ての箇所に記述し、「System.out.println」をロガーに変更することでも実現可能だが、スマートな方法とは言い難い。
そこで、今回紹介する方法は、ソースコードには手を加えず、「log4j.properties」を編集することで実現するものである。

Seasar公式ページのS2JDBCその他機能に下記の様な記述がある。

S2JDBCで実行したSQLは、Seasar2のロガーからログ出力されます。 SQLのログ出力を有効にするには、以下のカテゴリと出力レベルを有効にしてください。

org.seasar.extension.jdbc カテゴリ
DEBUG レベル

SQLは、バインド変数に実際に適用される引数が埋め込まれた状態でフォーマットされます。

よって、上記の内容を「log4j.properties」に追記する。

追記した「log4j.properties」の内容

log4j.category.org.seasar=DEBUG, C
log4j.additivity.org.seasar=false

log4j.category.tutorial=DEBUG, C
log4j.additivity.tutorial=false

log4j.appender.C=org.apache.log4j.ConsoleAppender
log4j.appender.C.Target=System.out
log4j.appender.C.ImmediateFlush=true
log4j.appender.C.layout=org.apache.log4j.PatternLayout
log4j.appender.C.layout.ConversionPattern=%-5p %d [%t] %m%n

log4j.rootLogger=INFO, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n


#↓↓↓↓↓ 今回追加部分 ↓↓↓↓↓

#SQLログ設定
log4j.category.org.seasar.extension.jdbc=DEBUG, S
log4j.additivity.org.seasar.extension.jdbc=false
log4j.appender.S=org.apache.log4j.DailyRollingFileAppender
log4j.appender.S.File=C:/temp/system_sql_log.log
log4j.appender.S.DatePattern='.'yyyy-MM-dd
log4j.appender.S.layout=org.apache.log4j.PatternLayout
log4j.appender.S.layout.ConversionPattern=---------- %d{yyyy/MM/dd HH:mm:ss} %p ----------%n%m%n%n
log4j.appender.S.Threshold=DEBUG
log4j.appender.S.Encoding=UTF-8

#↑↑↑↑↑ 今回追加部分 ↑↑↑↑↑

<実行結果>
C:\tempフォルダに「system_sql_log.log」ファイルが作成される。
ファイルの内容は下記の様になり、SQLが実行される度に追記される事になる。

---------- 2013/09/06 05:46:25 DEBUG ----------
-- EMP_SELECT.sql
-- 社員TBLから社員情報を取得するSQL
-- @see EmpDao#getAllInfo
-- @author xxxx
select
	emp_id,
	emp_name
from
	emp
where
	emp_id = 'E0002'

前回と同様に、SQLファイルの「--」コメントも出力対象となるので、分かりやすいコメントを記述しておくと、デバッグ作業が楽になる。

<ソースコード部分>
ソースコードには、SQLログを出力するための記述を、一切行っていない。
SQL発行部分のソースコード

package jp.co.smp.sqllog.dao;

import java.util.List;
import javax.annotation.Resource;
import jp.co.smp.sqllog.dto.EmpDto;
import org.seasar.extension.jdbc.JdbcManager;

public class EmpDao {
	
	@Resource
	protected JdbcManager jdbcManager;
	
	public List<EmpDto> getAllInfo(){
		
		List<EmpDto> results = jdbcManager.selectBySqlFile(
				EmpDto.class, 
				"/jp/co/smp/sqllog/entity/sql/EMP_SELECT.sql",
				"E0002"
				).getResultList();
		
		
		return results;
	}
}

使用SQLファイルの内容

-- EMP_SELECT.sql
-- 社員TBLから社員情報を取得するSQL
-- @see EmpDao#getAllInfo
-- @author xxxx
select
	emp_id,
	emp_name
from
	emp
where
	emp_id = /*emp_id*/'D9999'

今回紹介した方法を用いれば、システムが安定稼動するまでは、SQLログを出力し、安定した後は出力しないっといった制御を容易に行う事ができる。

<関連記事>
S2JDBC経由で発行されたSQLを確認する方法【個別SQL編】
S2JDBC経由で発行されたSQLを確認する方法【全SQL編】

<お勧め書籍>