今天,尝试使用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就没有出现类似问题。