この日記は私的なものであり所属会社の見解とは無関係です。 GitHub: takahashikzn

SLF4J-1.8は現時点ではlogbackで動かせない?

slf4j-1.8.0-beta0がリリースされていたので早速更新してみた所、こんなエラーが出てログが全く動かなくなりました。

SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#noProviders for further details.
SLF4J: Class path contains SLF4J bindings targeting slf4j-api versions prior to 1.8.
SLF4J: Ignoring binding found at [jar:file:/XXXXXXX/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#ignoredBindings for an explanation.

はあ、そうですか。

SLF4J: See http://www.slf4j.org/codes.html#noProviders for further details.

とあるのでリンク先を見てみたらこう書いてあります。

This warning, i.e. not an error, message is reported when no SLF4J providers could be found on the class path. Placing one (and only one) of slf4j-nop.jar slf4j-simple.jar, slf4j-log4j12.jar, slf4j-jdk14.jar or logback-classic.jar on the class path should solve the problem. Note that these providers must target slf4j-api 1.8 or later.


これはSLF4Jのプロバイダがクラスパス上に見つからないという警告である。エラーではない。クラスパスに、以下のいずれかのプロバイダを一つだけ置くこと。そうすれば問題は解消されるはず。

* slf4j-nop.jar
* slf4j-simple.jar
* slf4j-log4j12.jar
* slf4j-jdk14.jar
* logback-classic.jar

なお、これはslf4j-1.8以上に適用される話である。
In the absence of a provider, SLF4J will default to a no-operation (NOP) logger provider.

プロバイダが見つからない場合、NOP(何もしない)プロバイダが選択される。
Please note that slf4j-api version 1.8.x and later use the ServiceLoader mechanism. Earlier versions relied on the static binder mechanism which is no longer honored by slf4j-api. Please read the FAQ entry What has changed in SLF4J version 1.8.0? for further important details.


SLF4Jの1.8以降では[ServiceLocator](http://docs.oracle.com/javase/jp/8/docs/api/java/util/ServiceLoader.html)の仕組みが採用されている。
以前のバージョンで採用されていた静的バインディング機構はもう使われない。詳しくは「SLF4J 1.8の変更点」のFAQを参照せよ。


ドキュメントにはこのように「logback-classic」はプロバイダであると明記されているにも関わらず、件の警告が出て動きません。 実際、logback-classic-1.2.3.jarにはMETA-INF/servicesエントリが含まれていないのでプロバイダとして認識されません。

おそらくもう少し待てばlogback-classicの1.8対応版がリリースされるのだと思います。 というわけでSLF4J-1.7系にサクッと戻しました。