Q6:Commons Logging APIの実装としてLog4jを使うには?

元々Log4j でログ出力コードを記述していた場合、Jakarta Logging の API を使用するようソースを変更する必要がありますが、その変更は非常に簡単です。以下は Log4j によるロギングを Commons Logging を使うよう変更したソースです。

package logtest.p1;

//import org.apache.log4j.Logger;
import org.apache.commons.logging.*;

public class CommonLogTest {
    //private static final Logger logger = Logger.getLogger(CommonLogTest.class);
    public static Log logger = LogFactory.getLog(CommonLogTest.class);

    public void printLog() {
        logger.debug("DEBUG message");
        logger.info("INFO 日本語テスト 〜①");
        logger.warn("WARN message");
        logger.error("ERROR message", new Exception("error exception"));
        logger.fatal("FATAL message", new Throwable("fatal exception"));
    }
}

変更前の箇所を // でコメントアウトしています。// のコメントアウト行のすぐ下の行に変更後のコードを記述しています。上のように、2箇所の変更で済みました。元々 Commons Logging が Log4j と API やログレベルが似ているため、Log4j によるロギングをCommons Logging でラップすることは簡単にできるようです。

ソースを変更した後は、ロギング実装として Log4j を使用するよう設定する必要があります。Commons Logging はorg.apache.commons.logging.Log システムプロパティの値(各実装に対応したクラス名を与える)からロギング実装を選択します。Log4j ならば、org.apache.commons.logging.impl.Log4JLogger を設定します。

もしこのプロパティの値が設定されなかった場合、Commons Logging は以下の順でクラスパスからロギング実装を探し出し、見つかればその実装を使います。

  1. Log4j
  2. JDK1.4
  3. Jakarta Logging SimpleLog

そのため、Log4j を使う分においては、先のプロパティは設定する必要がありません。上のようにソースを変更し、Commons Logging の JAR ファイルをクラスパスに追加するだけですぐに使えるというわけです。

尚、各ロギング実装の設定ファイルはそのまま使えます。というより、設定ファイルを Commons Logging が読むわけではなく、各ロギング実装が読み込みます。ロギング実装として Log4j を使うならば、設定ファイルは Log4j のものを用意し、それを Log4j が読み込めるようにする必要があります。設定ファイルの扱いは個々のロギング実装に任されています。


トップページへ戻る