Sky's blog

我和我追逐的梦

常用链接

统计

其他链接

友情链接

最新评论

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 = {}"100200);

    运行后日志如下:


        
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就没有出现类似问题。


posted on 2010-04-26 08:54 sky ao 阅读(3045) 评论(0)  编辑  收藏 所属分类: java


只有注册用户登录后才能发表评论。


网站导航: