If I get rid of my "SLF4J Bindings Multiple Warning" registration will stop working

I have the following directory structure in 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 should live in the tomcat / lib directory as it contains the classes needed to run tomcat as a global resource. It writes an entry to slf4j, so slf4j and logback packages are also needed. It uses JoranConfigurator to load myStateLogback.xml.

myApp webapp writes it to commons-logging, but I want it to go through slf4j to register while preparing all our protocols for slf4j, so I use the jcl-over-slf4j bridge.

With the above setting, all logging works, but when I start, I get the following warning:

 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] 

If I take the classic journal from the webapp lib directory, I get the following exception:

 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) 

If I delete 2 logical banks and slf4j-api.jar from the webapp lib directory, I do not receive any warnings and exceptions, but the logs from my webapp are picked up by the myStateLogback.xml file and go to this logger, which I do not want. I know that I can filter out applications that I do not want, but want to have separate configuration files for webapp and bank. Is there any way to achieve this?

I am using tomcat 6.0.23, logback 0.9.29 and slf4j 1.6.3.

Thanks Sarah

+7
source share
2 answers

There is a chapter in the logback documentaiton, entitled Log Separation , which presents one possible solution.

+3
source

Using the new parameter -Dlogback.debug = true, messages will be displayed from what seems to be slf4j-api to look for its implementations. (Logging looks like a pet in the Java world to me).

  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
+1
source

All Articles