今天,嘗試使用slf4j + logback的黃金組合,結果發現有點問題,slf4j和logback的最新版本不兼容。當然slf4j是1.6.0-RC0,正式發布時logback應該會跟進發布新的版本吧。
使用的版本如下ivy文件所示:
<dependency org="org.slf4j" name="slf4j-api" rev="1.6.0-RC0"
conf="compile -> master" />
<dependency org="ch.qos.logback" name="logback-classic"
rev="0.9.20" conf="runtime -> master" />
<dependency org="ch.qos.logback" name="logback-core" rev="0.9.20"
conf="runtime -> master" />
slf4j是最新的1.6.0-RC0,logback也是最新的0.9.20。
測試代碼如下:
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
logger.info("Hello World");
// placeholder
logger.info("test placeholder: param1 = {}, param = {}", 100, 200);
運行后日志如下:
08:21:19.812 [main] INFO test.example1.HelloWorld - Hello World
Exception in thread "main" java.lang.NoSuchMethodError:
org.slf4j.helpers.MessageFormatter.arrayFormat(Ljava/lang/String;[Ljava/lang/Object;)
Ljava/lang/String;
at ch.qos.logback.classic.spi.LoggingEvent.getFormattedMessage(LoggingEvent.java:288)
at ch.qos.logback.classic.spi.LoggingEvent.prepareForDeferredProcessing
(LoggingEvent.java:196)
at ch.qos.logback.core.OutputStreamAppender.subAppend(OutputStreamAppender.java:211)
at ch.qos.logback.core.OutputStreamAppender.append(OutputStreamAppender.java:108)
at ch.qos.logback.core.UnsynchronizedAppenderBase.doAppend
(UnsynchronizedAppenderBase.java:91)
at ch.qos.logback.core.spi.AppenderAttachableImpl.appendLoopOnAppenders
(AppenderAttachableImpl.java:64)
at ch.qos.logback.classic.Logger.appendLoopOnAppenders(Logger.java:275)
at ch.qos.logback.classic.Logger.callAppenders(Logger.java:262)
at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:465)
at ch.qos.logback.classic.Logger.filterAndLog_2(Logger.java:456)
at ch.qos.logback.classic.Logger.info(Logger.java:631)
at test.example1.HelloWorld.main(HelloWorld.java:14)
可以看到第一個普通的"logger.info("Hello World");"語句打印正常,但是第二個使用了slf4j的placeholder特性的info語句遭遇異常:類org.slf4j.helpers.MessageFormatter 中沒有logback期望調用的一個方法。
猜測是slf4j新的1.6.0-RC0版本對類MessageFormatter 做了調整,而原有調用它的logback 0.9.20版本還沒有更新。試著更改ivy設置為:
<dependency org="ch.qos.logback" name="logback-classic"
rev="0.9.20" conf="runtime -> *" />
讓ivy自動將logback 0.9.20的依賴搞定,resolve成功后發現果然0.9.20是使用slf4j的1.5.11版本。運行上面的代碼,成功不再報錯:
08:37:00.562 [main] INFO test.example1.HelloWorld - Hello World
08:37:00.578 [main] INFO test.example1.HelloWorld - test placeholder: param1 = 100, param = 200
看來暫時還不能使用slf4j 1.6.0-RC0 + logback 0.9.20的組合了,看了一下logback的網站,沒有發現新的測試版本,只能退回到slf4j 1.5.11 + logback 0.9.20。等slf4j 1.6.0 release之后,logback 應該會發布新的版本吧。小小的鄙視一下logback,作為嚴重依賴slf4j的項目,居然不及時跟進。我測試過log4j的版本在新的1.6.0-RC0就沒有出現類似問題。