JAVAのlog4jdbcについてあまり記載されているものがなかったので、試行錯誤した結果をメモすることにしました。
JAVAのWEBアプリ環境でありながら、tomcatやapache等を経由しないJAVAアプリを作ることになった。(cronで動かすため)
通常でoracleにどういったSQLを流したか、どのような値を取得したか等をログ表示できるようにしてほしいとのこと。
コンソール上で表示するならば、java.lang.System.out.printlnを使って表示させることはできるが、SQLの度にjava.lang.System.out.printlnを打たないといけないし、さらに言えば.setStringの旅にjava.lang.System.out.printlnを打たないといけないのがめんどくさい。
そして、select等で取得した値もjava.lang.System.out.printlnにて取得しないといけないので一つSQLが追加されただけで、プログラミングの量が大幅に増えていってしまう。
ほかにもファイル出力形式もできるが上記と同様になると思う。
もっと簡単にログ出力をする方法はないのかと考えた結果log4jdbcが使えないだろうかという案が浮上した。
log4jdbcについて書いている記事って思ったよりも少ないんですね…(GOOGLEだと2011年5月15日時点の日本語のページで3670件でした。)
ただし、log4jdbc単体で用いても、なんもログは出力されないので、ロガーもインストールが必要になる。
今回はSLF4Jを使用します。
まず、こちらからlog4jdbcをダウンロードしてきます。(JDKによってファイルが違うので、適切なものを取得してください。)
次に、こちらからSLF4J(slf4j-1.6.1.zip)をダウンロードしてきます。
そして、今回はlogbackも使用するのでこちらからlogback-0.9.28.zipをダウンロードしてきます。
そしてそれぞれのファイルを解凍し、以下の入るをビルド・パスが通る場所(Eclipseでは外部jarの追加等でOK)に設置または設定する。
log4jdbc3-1.2beta2.jar(log4jdbcのサイトから)
slf4j-api-1.6.1.jar(slf4j-1.6.1.zipから)
logback-classic-0.9.28.jar(slf4j-1.6.1.zipから)
logback-core-0.9.28.jar(logback-0.9.28.zipから)
Class.forNameのURL変更
//Class.forName("oracle.jdbc.driver.OracleDriver");
Class.forName("net.sf.log4jdbc.DriverSpy");
logbackの設定
クラスパスが通るところ(src直下等)にlogback.xmlを設置する。
System.out
UTF-8
[%-5level][%d{yyyy-MM-dd HH:mm:ss}] %class - %msg%n
/logs/webapp.log
/logs/webapp.%d{yyyyMMdd}.log
2
[%-5level][%d{yyyy-MM-dd HH:mm:ss}] %class - %msg%n
xmlファイルは忘れな~い録さんからいただきました。ありがとうございます。
level valueでどこまでの情報を表示させるかになる。debug info worn error all trace等がある。
次に、rootでどの情報を表示させるか。上記ではコンソール上とログ上に表示するようになっています。
ほかにもいろいろありますが、見ていたらなんとなくわかると思いますので割愛。
これらの設定ができたら実行ボタンを押してみてください。
sqlが流れるたびにログが表示されているかと思います。
このログ表示は任意に文字列を表示することもできます。
クラス内で
private static final Logger log = LoggerFactory.getLogger(ログ表示させる.class);
にて定義し、
main関数等で
log.debug("It's debug log");//デバッグで出力
log.info("It's info log");//infoで出力
log.warn("It's warn log");//Warn時で出力
log.error("It's error log");//errorで出力
log.fatal("It's fatal log");//fatalで出力
にて表示させることが可能。ただし、logback.xmlのlevel valueの設定にて表示されない場合があります。(levelがinfoの場合はdebugのログは表示されない等)
さらに、コンソール上で色づけもできるようですが、それはまた今度の機会で公開します。