便利なコードパーツ集!

やまろうのプログラミングTips

Java

Jakarta Commons Logging + log4jを使おう!

投稿日:2016年12月6日 更新日:

2003年

「無事リリース」でおなじみのやまろうです。

プロトタイプの開発がとりあえず完了しました。今のところ
トラブルもなく平和な日々です。
しかし、リリース当日こんな出来事がありました。

Y「あれ、今日、疎通確認ってしましたっけ?」
X「いやー、やってないけど、さんざんテストしたから大丈夫だろ」
Y「でも、DBサーバやLDAPサーバが起動されてなかったりするだけで
動かなくなりますよ。しかも、サーバのコンソールに例外がいっぱい
出てますよ。」

X「昨日テストして確認したんだから、プログラムは間違ってないだろ!
環境の問題で動かなかったら、それはSEのせいだろ?」

Y「・・・・。」

自分のせいにならなければそれでいいのだろうか?
自分のせいにならなくたって、失敗したら駄目じゃないか?!
いったい何のために開発をするのだろうか?

個人的には「自分のスキルを高めるため」だったり
「プログラミングがおもしろいから」だったりするけれども、それだけではなくて
やっぱり、いいものを作りたいし、使う人に喜んでほしい!

だったら、誰の責任だからとか、自分のせいじゃないからとかじゃなく、
自分の出来ることを精一杯やればいいと思う。責任ってのは、人に
持たされるんじゃなくて、自分で持つものなんだと思う!

ちゃんちゃん。心の叫びでした。

それでは本題「Jakarta Commons Logging + log4jを使おう!」

Struts本を読んでいたら、いいものを発見したので紹介します。
Jakarta Commons Loggingってやつです。
Jakarta Commons LoggingはログAPIの汎用的なインターフェースを
提供します。つまり、インターフェースのみで自分ではログ出力を
しません。ファイルcommons-logging.propertiesに使用するログAPIの
アダプタークラスを指定します。

[commons-logging.properties]

org.apache.commons.logging.log=org.apache.commons.logging.impl.Log4JCategoryLog

すると、Commons Loggingは内部的にlog4jを使用してログを出力します。

log4jを利用するのでファイルlog4j.propertiesも必要です。
[log4j.properties]

log4j.rootLogger=DEBUG,stdout,R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d (%F:%L) %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d (%F:%L) %m%n
log4j.appender.R.File=example.log

上記2つのファイルと、commons-logging.jar,log4j-1.2.5.jarを
クラスパス上に配置します。commons-logging.jarとlog4j-1.2.5.jarは
Jakarta Projectのホームページからダウンロードしてね!

以下はロギングを行うサンプルです。

package etc;

import org.apache.commons.logging.*;

public class CommonsLog {
  private Log log = LogFactory.getLog(this.getClass());

  public static void main(String[] args) throws Exception {
    CommonsLog commonsLog1 = new CommonsLog();
    commonsLog1.execute();
  }
  public void execute() throws Exception {
    log.debug("debug logです");
    log.info("info logです");
  }
}

[実行]

log4j.properties,commons-logging.properties,
commons-logging.jar,log4j-1.2.5.jarをソースコードと同じディレクトリに
配置して、以下のコマンドを実行します。

javac -classpath %classpath%;commons-logging.jar -d . *.java

以下を1行で入力して実行します。

java -classpath %classpath%;commons-logging.jar;.;log4j-1.2.5.jar (次行へ)
-Dorg.apache.commons.logging.log=(次行へ)
org.apache.commons.logging.impl.Log4JCategoryLog etc.CommonsLog

[実行結果]

2003-08-04 09:52:57,687 (CommonsLog.java:44) debug logです
2003-08-04 09:52:57,703 (CommonsLog.java:45) info logです

結果はコンソールとexample.logっていうファイルに出力されるはずです。

ソースコードの中にlog4jという単語は一切登場していません。しかし、実際は
log4jを使用してログを出力します。
これにより、ログ出力のコードを変更せずにログAPIを変更することが可能です。

もひとつ便利な機能を紹介します。
log4j.propertiesの
log4j.rootLogger=DEBUG,stdout,R
の行を
log4j.rootLogger=INFO,stdout,R
と変更すると
log.debug(String s)
が実行されなくなります。

これにより、開発作業中はlog.debug(String s)を有効にしておき、
完成して、リリースとなったら無効にするといったことが可能です。
そして、リリース後に障害が発生した場合には、デバック出力を有効にして
障害の解析を行うといったことが可能です。そして何よりこれらの作業が
コードを変更することなく、設定ファイルを変更するだけで出来るのです。

ってなわけで、Log APIはとても役に立ちます。そして、Log APIを
Commons Loggingを通して利用することにより、Log APIに依存しないコードを
書くことが出来ます。

んじゃ!
                 やまろう

スポンサーリンク

-Java

Copyright© やまろうのプログラミングTips , 2024 AllRights Reserved Powered by AFFINGER4.