作成 2002/10/26
更新 2003/8/21
複数のコンポーネントで異なるロギング機構を使っていると、 コンポーネントを利用するアプリケーションで、 ログの制御をするのが大変です。 ログ設定ファイルを変更するのにも、 そのコンポーネントごとの設定ファイルを書かねばなりません。 めんどくさいね。まとめようよ。 ということで生まれたのが、このCommons Loggingです。
現在、以下のロギング実装に対応しています。
Log4J | かなり標準ぽかったロギング実装 |
JDK Logging API | JDK1.4から導入されたロギング実装。 |
LogKit | よく知らないけけど、ロギング実装。 |
NoOpLog | オリジナルの簡単なロギング実装。ログ出力しない。 |
SimpleLog | オリジナルの簡単なロギング実装。System.outのみ。 |
Commons Logginでは、 これらのロギング実装の共通機能をまとめたインターフェイス と各ロギング実装のアダプターを提供します。 分散オブジェクトに対するWebサービスみたいなもんでしょうか。 どれかのロギング実装が天下統一すれば、 問題は解決しますが、 それは難しいので、共通インターフェイスを作って、 それを利用しましょうって感じ。
ログのレベルには以下のものがあります。
パフォーマンス重視する部分では、以下のように書きます。
if (log.isDebugEnabled()) { log.debug(...); }
まあ、簡単な仕組みですね。 めんどくさい(こともないけど)のは、設定の部分でしょうか。
簡単なサンプルです。
package logging; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class SimpleLogging { private static Log log = LogFactory.getLog(SimpleLogging.class); public static void main(String[] args) { log.info("情報だぜ"); log.debug("デバッグだぜ"); } }
ログの実行の指定には以下のVM引数を指定します。
-Dorg.apache.commons.logging.Log
例えば、SimpleLog実装を指定するには、以下のようにします。
java -Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog logging.SimpleLogging
Log4Jの場合は、
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
JDK Logging APIの場合は、
org.apache.commons.logging.impl.Jdk14Logger
を指定します。
SimpleLogを指定して実行した実行結果は以下のようになります。
[INFO] SimpleLogging - -情報だぜ
SimpleLogでレベルを設定したりする場合は、 simplelog.propertiesファイルをクラスパスのルートに置きます。
simplelog.propertiesの例
org.apache.commons.logging.simplelog.defaultlog=debug
実行すると、
[INFO] SimpleLogging - -情報だぜ [DEBUG] SimpleLogging - -デバッグだぜ
DEBUGレベルも表示されました。
Log4JやJDK LoggingAPIの設定については、以下の参考を見てください。
ちなみに、VM引数に何も指定しないと、うちの環境(JDK1.4)では、 JDK Logging APIのログが表示されました。そういうもんか。
と思ったら、ログ実装の選択優先順位などは、
org.apache.commons.logging
パッケージドキュメントに書いてましたね。
VM引数に指定せずに、SimpleLogをdebugレベルで使いたい という場合は、クラスパスのルートに commons-logging.properties と simplelog.properties を置くというやり方でも動くようです。
4.でなきゃデフォルトの場合
困ったことにWebSphere上では、デフォルトではcommons-loggingが利用できないようです(WAS5.0で確認)。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=5525&forum=12
先にWASのcommons-loggingの設定が読まれてしまい。デプロイした各アプリケーションの設定が有効になりません。例えば、内部的にはlog4jを利用するのであれば、LogFactoryの代わりに以下のようなFactoryを自作し、Log4JLoggerを直接返せばcommonsのLog型では使えました。commons-loggingの意味がないけど、log4jを直接使うよりは柔軟か(あとでcommons loggingに変えやすい)。
public class HogeLogFactory { public static Log getLog(Class clazz){ Logger real = Logger.getLogger(clazz); Log4JLogger logger = new Log4JLogger(real); return logger; } }