web-dev-qa-db-ja.com

sl4jとlogback-パッケージのログレベルをプログラムで設定することは可能ですか?

次のコードを使用して、プログラムでログレベルをアプリケーションに設定できますが、これを行うことも可能ですパッケージレベルで、たとえばcom.somepackage。*と指定して、レベルを設定します上記のパッケージのデバッグまたは情報ではなくエラーのみである?

// Sets the logging level to INFO
LoggerContext loggerContext = (LoggerContext)LoggerFactory.getILoggerFactory();
Logger rootLogger = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
rootLogger.setLevel(Level.INFO);

しかし、パッケージレベルで設定する方法を見つけることができないようです...

19

パッケージ名をロガー名として設定する必要があります

// Sets the package level to INFO
LoggerContext loggerContext = (LoggerContext)LoggerFactory.getILoggerFactory();
Logger rootLogger = loggerContext.getLogger("com.somepackage");
rootLogger.setLevel(Level.INFO);

パッケージ名をもっとエレガントにできるはずですが、これは基本的にはそれです。これは、ロガーコンテキストのツリーのような階層に従います。 Logger Context

25
Dimitri Dewaele

これは、logbackを使用して実行できます。

Logger LOG = (Logger) org.slf4j.LoggerFactory.getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME);
LOG.setLevel(Level.WARN);

これは私の問題を解決しました。

4
Nandu Prajapati

パッケージのSLF4Jロガーを取得して、それをLogbackロガーにキャストできます。 @ dimitri-dewaeleのコードよりも少ない。

((Logger) LoggerFactory.getLogger("com.somepackage")).setLevel(DEBUG)

@ nandu-prajapatiのアプローチは似ていますが、ルートロガーレベルを設定するもので、望ましいレベルではありません。

1
Abhijit Sarkar

Logback-classicをコンパイル時の依存関係に変更したくない場合は、次のコードでリフレクションを使用してこのレベルを設定し、logbackがslf4jランタイムバインディングとして使用されていると想定しています。ここでAbcClassは、ロガーレベルを[〜#〜] trace [〜#〜]に変更するクラスです。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SomeClass {
private static final Logger logger = LoggerFactory.getLogger(SomeClass .class);
    public static void beforeEachTest() throws Exception {
        final Logger loggerInterface = LoggerFactory.getLogger(AbcClass.class);
        String loggerLevelNew = "TRACE";
        if (!loggerInterface.isTraceEnabled()) {
            try {
                Class<?> levelLogBackClass = Class.forName("ch.qos.logback.classic.Level");
                Method toLevelMethod = levelLogBackClass.getDeclaredMethod("toLevel", String.class);
                Object traceLvel = toLevelMethod.invoke(null, loggerLevelNew);
                Method loggerSetLevelMethod= loggerInterface.getClass().getDeclaredMethod("setLevel", levelLogBackClass);
                loggerSetLevelMethod.invoke(loggerInterface, traceLvel);
            } catch (Exception e) {
                logger.warn("Problem setting logger level to:{}, msg: {}", loggerLevelNew, e.getMessage());
                throw e;
            }
        }
    }
}

Log4jとJDKのロギングでも同様のことを実行して、この(種類の)ライブラリにとらわれないようにすることができます

1
Deepak