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-api
JAR には独自のダミー実装も付属しています。これorg.slf4j.impl.StaticLoggerBinder
は、おそらく SLF4J 開発中のコンパイラ エラーを防ぐためです (または、バインディングによって何も提供されない場合は、ノーオペレーション フォールバックとして機能しStaticLoggerBinder
ます)。
したがって、実行時クラスパスにslf4j-api-1.7.5
とslf4j-simple-1.7.5
がある場合、たとえば を初めて使用するときに、JARLogger#info(String)
でStaticLoggerBinder
定義されたものよりも JAR で定義されたものがslf4j-simple
選択されます。StaticLoggerBinder
slf4j-api
この「設定」/優先順位付け (api impl よりも impl をバインドする) がどのように機能するかを理解しようとしています。上記のメソッドは、最初に で提供されStaticLoggerBinder
たダミーよりもバインディングをどのように選択しますか?StaticLoggerBinder
slf4j-api
前もって感謝します!