実行したSQL文のログを出力するには? | Java Springの逆引きメモ

Java Springの逆引きメモ

JavaのSpring frameworkのメモを書いていきます!
初心者の勉強ノートなので間違いがあるかもしれませんが、何かヒントになることがあれば幸いです。

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の機能について

・SpringJDBCで作成したDaoとビジネスロジックを連携するには?

・DBからデータを取得するには?(SimpleJdbcTemplate のサンプル)

・DBからデータを取得するには?(NamedParameterJdbcTemplateのサンプル)

・NamedParameterJdbcTemplateをうまく使うには? (HashMap版)

・結果をMapの配列で受け取るには?

・DBにデータを登録するには?

・DBへのデータ登録を簡単にするには?

・実行したSQL文のログを出力するには?

設定ファイルの利用(Log4j)