首页 文章

如果我摆脱了我的'multiple SLF4J Bindings'警告,日志记录就会停止工作

提问于
浏览
7

我在tomcat 6中有以下目录结构:

tomcat
|-lib
|  |- logback-classic.jar
|  |- logback-core.jar
|  |- slf4j-api.jar
|  |- myState.jar
|-shared
|  |-lib
|  |  |- myStateLogback.xml
|-webapps
|  |-myApp
|  |  |-WEB-INF
|  |  |  |-logback.xml
|  |  |  |-lib
|  |  |  |  |-jcl-over-slf4j.jar
|  |  |  |  |-logback-classic.jar
|  |  |  |  |-logback-core.jar
|  |  |  |  |-slf4j-api.jar

myState.jar需要存在于tomcat / lib目录中,因为它包含tomcat启动时作为全局资源所需的类 . 它将其记录到slf4j,因此还需要slf4j和logback jar . 它使用JoranConfigurator加载myStateLogback.xml .

myApp webapp将其记录到commons-logging,但是我希望它通过slf4j进行logback以准备将所有日志记录移动到slf4j,所以我使用的是jcl-over-slf4j桥 .

通过上面的设置,日志记录全部有效,但我在启动时收到以下警告:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/D:/tomcat/lib/logback-classic-0.9.29.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/D:/tomcat/webapps/myApp/WEB-INF/lib/logback-classic-0.9.29.jar!/org/slf4j/impl/StaticLoggerBinder.class]

如果我从webapp的lib目录中取出logback-classic,我会得到以下异常:

Exception in thread "Timer-30" java.lang.LinkageError: loader constraint violation: when resolving method "org.slf4j.impl.StaticLoggerBinder.getLoggerFactory()Lorg/slf4j/ILoggerFactory;" the class loader (instance of org/apache/catalina/loader/WebappClassLoader) of the current class, org/slf4j/LoggerFactory, and the class loader (instance of org/apache/catalina/loader/StandardClassLoader) for resolved class, org/slf4j/impl/StaticLoggerBinder, have different Class objects for the type org/slf4j/ILoggerFactory used in the signature
        at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:284)
        at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:252)
        at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:156)
        at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:132)
        at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:272)

如果我从webapp的lib目录中删除了2个logback jar和slf4j-api.jar,我没有得到警告也没有例外,但我的webapp的日志被myStateLogback.xml文件选中并转到它的logger,这是我不想要的 . 我知道我可以过滤掉我不想要的语句,但我想为webapp和jar分别配置文件 . 有没有办法实现这个目标?

我正在使用tomcat 6.0.23,logback 0.9.29和slf4j 1.6.3 .

谢谢,莎拉

2 回答

  • 3

    在logback文档中有一章名为logging separation,其中提供了一种可能的解决方案 .

  • 1

    使用新的-Dlogback.debug = true选项将显示来自slf4j-api的消息,以查找其实现 . (对我来说,Logging看起来像是Java世界中的一个宠儿) .

    09:12:05,472 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
    09:12:05,472 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback-test.xml] at [jar:file:/home/FOO/BAR.jar!/logback-test.xml]
    09:12:05,487 |-INFO in ch.qos.logback.core.joran.spi.ConfigurationWatchList@2c8d66b2 - URL [jar:file:/home/FOO/BAR.jar!/logback-test.xml] is not of type file
    09:12:05,656 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
    09:12:05,662 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
    09:12:05,700 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
    09:12:05,729 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [org.mongodb.morphia.mapping.Mapper] to ERROR
    09:12:05,729 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [com.BAZ] to DEBUG
    09:12:05,729 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to INFO
    09:12:05,730 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT]
    09:12:05,730 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
    09:12:05,732 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@58651fd0 - Registering current configuration as safe fallback point
    

相关问题