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]
すると、Commons Loggingは内部的にlog4jを使用してログを出力します。
log4jを利用するのでファイルlog4j.propertiesも必要です。
[log4j.properties]
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です"); } }
[実行]
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,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に依存しないコードを
書くことが出来ます。
んじゃ!
やまろう