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編】
<お勧め書籍>