そごうソフトウェア研究所

SOA、開発プロセス、ITアーキテクチャなどについて書いています。Twitterやってます@rsogo

久しぶりにLog4jを触ったので、メモ。


Log4jの設定ファイルを指定する場合、以下の3つのパターンが思いつきました。
(1)クラスパスの通ったところに置く
(2)-Dlog4j.configuration=urlを使って、Javaオプションで指定
(3)DOMConfiguratorクラスを使って、ロジック中で指定


それぞれのメリット、デメリットを考えてみました。


(1)クラスパスの通ったところに置く
これが一般的なやり方でしょうか。アプリの配下のクラスパスの通ったとこに置くことで、アプリごとの設定も可能だと思います。


(2)-Dlog4j.configuration=urlを使って、Javaオプションで指定クラスパスに存在する設定ファイルの内容を上書くことができます。


-Dlog4j.configuration=file:///D:\tmp\log4j-custom.xml


ただし、Webアプリケーション等の場合、同じインスタンスにデプロイされた他のアプリケーションの影響を考慮する必要があるので使用できるかどうかは、ケースバイケースだと思います。


(3)DOMConfiguratorクラスを使って、ロジック中で指定


例えば次のようなサンプルを動かした場合、設定ファイルが複数あってもカテゴリが重複しなければ、それぞれにログ出力を行えます。この柔軟性がメリットとして挙げられそうです。また、影響範囲はアプリケーション内にとどまる様です。

org.apache.log4j.xml.DOMConfigurator.configure("D:\\tmp\\log4j-custom.xml");
org.apache.log4j.Logger logger =
(org.apache.log4j.Logger)org.apache.log4j.Logger.getInstance("test.custom");
logger.error("CLIENT_LOG4J_TEST!");


org.apache.log4j.xml.DOMConfigurator.configure("D:\\tmp\\log4j-custom1.xml");
org.apache.log4j.Logger logger1 =
(org.apache.log4j.Logger)org.apache.log4j.Logger.getInstance("test.custom1");
logger1.error("CLIENT_LOG4J_TEST!");


logger.error("CLIENT_LOG4J_TEST!");

このときのログ出力の内容はというと、、

<2007-03-28 21:22:27,026> CLIENT_LOG4J_TEST!
<2007-03-28 21:22:27,056> CLIENT_LOG4J_TEST!
<2007-03-28 21:22:27,056> CLIENT_LOG4J_TEST!

問題なしですね。
実際には設定ファイルのパスは別の設定ファイルに書くなりすることになるので、今のところあまりデメリットも思いつきません。