SpringJDBCを使用している場合にSQL文をログ出力するには簡単な方法があります。
実は、DEBUGモードにするとSpringJDBCはSQL文を出力してくれます。
しかし、さすがDUBUGモード。
SQL文以外も多量のログが出力されます。
ですので、Log4jの機能を使用して制限します。
【Log4jのpropertiesファイル】
以下の設定を追加します。
stdoutに出力する場合のイメージです。
#SpringJdbcのログ出力(SQL文)
log4j.logger.org.springframework.jdbc.core.JdbcTemplate=DEBUG, stdout
log4j.additivity.org.springframework.jdbc.core.JdbcTemplate=false
log4j.logger.org.springframework.jdbc.core.StatementCreatorUtils=DEBUG, stdout
log4j.additivity.org.springframework.jdbc.core.StatementCreatorUtils=false
※stdoutは別途設定しておきます。例としては以下の感じです。
#stdoutの設定(出力先など)
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
【説明】
SQL文の出力は、org.springframework.jdbc.core.JdbcTemplateが行っています。
出力例:↓
2009-03-28 13:47:45,765 [http-8080-Processor24] DEBUG org.springframework.jdbc.core.JdbcTemplate - Executing prepared SQL statement [select * from member where id like ? || '%']
しかし、これだけを出力しても?の値は分かりません。
その値を出力させるのが、org.springframework.jdbc.core.StatementCreatorUtilsです。
出力例:↓
2009-03-28 13:47:45,812 [http-8080-Processor24] DEBUG org.springframework.jdbc.core.StatementCreatorUtils - Setting SQL statement parameter value: column index 1, parameter value [2009], value class [java.lang.String], SQL type unknown
これで、SpringJDBCで実施したSQL文はすべてコンソールに出力されますね!
ちなみに以下の設定は、重複してログを出させないための設定で、Log4jのための設定です。
Springとは関係ありません。
どうもLog4jは、デフォルトでlog4j.logger.・・・の設定の数だけ同じログが出力されるようです。
(正直なぜデフォルト?と思いますが。。)
log4j.additivity.org.springframework.jdbc.core.JdbcTemplate=false
【メインのログファイルと別のファイルに出力する場合】
ここからはLog4jの機能の話になるので、Springは関係ありませんが、一応書いておきます。
以下のように追記すればOKです。
#SpringJdbcのログ出力(SQL文)
log4j.logger.org.springframework.jdbc.core.JdbcTemplate=DEBUG, stdout, logfile
log4j.additivity.org.springframework.jdbc.core.JdbcTemplate=false
log4j.logger.org.springframework.jdbc.core.StatementCreatorUtils=DEBUG, stdout, logfile
log4j.additivity.org.springframework.jdbc.core.StatementCreatorUtils=false
#ログファイルの設定
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=c:/test_springapp.log
log4j.appender.logfile.Append=true
log4j.appender.logfile.MaxFileSize=512KB
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
上記の設定で、コンソールと
c:/test_springapp.logに出力されます。
【補足】
ただし、上記の方法はすべてのSQL文を出力します。
もし、update系だけを出力したい、という場合は自分で処理を作るしかありません。
このあたりはAOPも使いにくい感じです。
考えられる方法は、DataSourceを拡張して自分で拡張したPrepareStatementなどを返すようにします。
その拡張されたPrepareStatementがexceuteなどを呼ばれたときにログを出力するようにします。
このときに、先頭が"update"で始まるもののみログ出力します。
(空白の除去やすべて小文字にしてからなどの注意点が必要です)
もう、このぐらいしか思いつきません。。
もしかしたら、そういったログを取るフレームワークがあるかもしれないですが。
すみません。調べましたが見つかりませんでした。
参考:
・SpringJDBCで作成したDaoとビジネスロジックを連携するには?
・DBからデータを取得するには?(SimpleJdbcTemplate のサンプル)
・DBからデータを取得するには?(NamedParameterJdbcTemplateのサンプル)
・NamedParameterJdbcTemplateをうまく使うには? (HashMap版)