Commons

作成 2002/10/26
更新 2003/8/21

Logging

Loggingって?

複数のコンポーネントで異なるロギング機構を使っていると、 コンポーネントを利用するアプリケーションで、 ログの制御をするのが大変です。 ログ設定ファイルを変更するのにも、 そのコンポーネントごとの設定ファイルを書かねばなりません。 めんどくさいね。まとめようよ。 ということで生まれたのが、この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のログが表示されました。そういうもんか。

参考

追記 VM引数で指定しなくてもよか

と思ったら、ログ実装の選択優先順位などは、
org.apache.commons.logging
パッケージドキュメントに書いてましたね。

  1. org.apache.commons.logging.LogFactoryシステムプロパティー
  2. jarのMETA-INF/services..
  3. クラスパスのcommons-logging.properties
  4. でなきゃデファルト
だそうです。

VM引数に指定せずに、SimpleLogをdebugレベルで使いたい という場合は、クラスパスのルートに commons-logging.propertiessimplelog.properties を置くというやり方でも動くようです。

4.でなきゃデフォルトの場合

  1. org.apache.commons.logging.Logシステムプロパティー
  2. Log4J
  3. JDK1.4
の順とのこと。 うちの環境でJDK1.4が選択されたのはそういうわけでしたか。 ドキュメントはよく読みましょうということですね。。。

追記2 WebSphereでの利用

困ったことに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;
    }
}

TOP