[Java] プログラムによるLog4jロガーの設定


Answers

"両端"(消費者側と構成側)からlog4jを使用しようとしているようです。

slf4j apiに対してコードを作成したいが、クラスパスが返すlog4j Loggerの設定を事前に(そしてプログラムで)決めたいのであれば、怠惰な構築を利用したある種のロギングの適応が絶対必要です。

public class YourLoggingWrapper {
    private static boolean loggingIsInitialized = false;

    public YourLoggingWrapper() {
        // ...blah
    }

    public static void debug(String debugMsg) {
        log(LogLevel.Debug, debugMsg);
    }

    // Same for all other log levels your want to handle.
    // You mentioned TRACE and ERROR.

    private static void log(LogLevel level, String logMsg) {
        if(!loggingIsInitialized)
            initLogging();

        org.slf4j.Logger slf4jLogger = org.slf4j.LoggerFactory.getLogger("DebugLogger");

        switch(level) {
        case: Debug:
            logger.debug(logMsg);
            break;
        default:
            // whatever
        }
    }

    // log4j logging is lazily constructed; it gets initialized
    // the first time the invoking app calls a log method
    private static void initLogging() {
        loggingIsInitialized = true;

        org.apache.log4j.Logger debugLogger = org.apache.log4j.LoggerFactory.getLogger("DebugLogger");

        // Now all the same configuration code that @oers suggested applies...
        // configure the logger, configure and add its appenders, etc.
        debugLogger.addAppender(someConfiguredFileAppender);
    }

このアプローチでは、log4jロガーがいつどこで設定されるか心配する必要はありません。 クラスパスが最初にそれらを要求すると、遅れて構築され、戻ってslf4jで利用可能になります。 これが助けて欲しい!

Question

私はSLF4J( log4jバインディング付き)を初めて使用しようとしています。

LoggerFactoryによって返される3つの異なる名前付きロガーを設定して、異なるレベルを記録し、異なるアペンダーにメッセージをプッシュします。

  • Logger 1 "FileLogger"はDEBUGを記録し、 DailyRollingFileAppender追加しDailyRollingFileAppender
  • Logger 2 "TracingLogger"はTRACE +を記録し、 JmsAppender追加しJmsAppender
  • Logger 3 "ErrorLogger"はERROR +を記録し、別のJmsAppender追加しJmsAppender

さらに、それらをプログラムで(XMLやlog4j.propertiesファイルではなく)Javaで構成したいと思っています。

私は通常、 init()メソッドのように、これらのLoggerブートストラップコードのどこかに定義すると思います。 しかし、私はslf4j-log4jを使いたいので、私はロガーを定義してクラスパスでそれらを利用できるようにすることが混乱しています。

SLF4J APIを使用している私のコードは、これらのロガーが存在することを今までは知りませんので、これがSLF4Jの根底にある目的(ファサードとして)に違反しいるとは思いません。 私のコードはSLF4J APIへの通常の呼び出しを行い、クラスパス上で見つかったlog4jロガーにそれらを転送します。

しかし、クラスパス上のlog4jロガーをどのように設定するのですか?Javaで!