slf4j1.6.0-RC0和logback的0.9.20版本不兼容

slf4j1.6.0-RC0和logback的0.9.20版本不兼容

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


你可能感兴趣的:(slf4j1.6.0-RC0和logback的0.9.20版本不兼容)