1

slf4j-api (たとえば 1.7.5 などの最新バージョン) のソース コードを見るLoggerFactoryと、次のメソッドを持つクラスがあります。

private static Set findPossibleStaticLoggerBinderPathSet() {
    // use Set instead of list in order to deal with  bug #138
    // LinkedHashSet appropriate here because it preserves insertion order during iteration
    Set staticLoggerBinderPathSet = new LinkedHashSet();
    try {
        ClassLoader loggerFactoryClassLoader = LoggerFactory.class
                .getClassLoader();
        Enumeration paths;
        if (loggerFactoryClassLoader == null) {
            paths = ClassLoader.getSystemResources(STATIC_LOGGER_BINDER_PATH);
        } else {
            paths = loggerFactoryClassLoader
                    .getResources(STATIC_LOGGER_BINDER_PATH);
        }
        while (paths.hasMoreElements()) {
            URL path = (URL) paths.nextElement();
            staticLoggerBinderPathSet.add(path);
        }
    } catch (IOException ioe) {
        Util.report("Error getting resources from path", ioe);
    }
    return staticLoggerBinderPathSet;
}

これは、Loggerメソッド (debug、info、warn、error など) を呼び出したときに呼び出され、SLF4J バインディングがまだ初期化されていません。これは、SLF4J が実行時に使用するバインディングを決定する方法です。

基本的に、SLF4J の適切なバインディングを作成する 1 つの方法は、独自のorg.slf4j.impl.StaticLoggerBinderクラスを実装することです。ただし、slf4j-apiJAR には独自のダミー実装も付属しています。これorg.slf4j.impl.StaticLoggerBinderは、おそらく SLF4J 開発中のコンパイラ エラーを防ぐためです (または、バインディングによって何も提供されない場合は、ノーオペレーション フォールバックとして機能しStaticLoggerBinderます)。

したがって、実行時クラスパスにslf4j-api-1.7.5slf4j-simple-1.7.5がある場合、たとえば を初めて使用するときに、JARLogger#info(String)StaticLoggerBinder定義されたものよりも JAR で定義されたものslf4j-simple選択されます。StaticLoggerBinderslf4j-api

この「設定」/優先順位付け (api impl よりも impl をバインドする) がどのように機能するかを理解しようとしています。上記のメソッドは、最初に で提供されStaticLoggerBinderたダミーよりもバインディングをどのように選択しますか?StaticLoggerBinderslf4j-api

前もって感謝します!

4

1 に答える 1

2

ダミーの StaticLoggerBinder は、単に slf4j-api jar ファイルに含まれていません。

slf4j-api ソース コードの pom.xml を参照してください。ダミーバインダーは削除されます。

于 2013-10-28T11:40:31.950 に答える