Если я избавлюсь от предупреждения о нескольких привязках SLF4J, ведение журнала перестанет работать.

У меня есть следующая структура каталогов в 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. Он использует JoranConfigurator для загрузки myStateLogback.xml.

myApp webapp пишет, что ведет журнал в журнал общих ресурсов, но я хочу, чтобы он прошел через slf4j в журнал для подготовки к перемещению всех наших журналов в 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]

Если я беру logback-classic из каталога lib веб-приложения, я получаю следующее исключение:

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)

Если я удалю 2 logback jar и slf4j-api.jar из каталога lib веб-приложения, я не получу ни предупреждений, ни исключений, но журналы из моего веб-приложения подхватываются файлом myStateLogback.xml и переходят к его регистратору, чего я не хочу. Я знаю, что могу отфильтровать операторы, которые мне не нужны, но я хочу иметь отдельные файлы конфигурации для веб-приложения и jar. Есть ли способ добиться этого?

Я использую tomcat 6.0.23, logback 0.9.29 и slf4j 1.6.3.

Спасибо, Сара


person ssloan    schedule 06.01.2012    source источник


Ответы (2)


В документации по журналированию есть глава под названием разделение журналов, в которой представлено одно из возможных решений.

person Ceki    schedule 07.01.2012
comment
Спасибо за это - очень интересно, и я думаю, что это сработает в этой ситуации. Однако для простоты мы решили использовать ведение журнала tomcat juli для myState.jar, а затем поместить jar-файлы logback/slf4j в каждое веб-приложение, чтобы они могли управлять собственным ведением журнала. - person ssloan; 09.01.2012

Использование новой опции -Dlogback.debug=true покажет сообщения от того, что кажется slf4j-api, ищущим его реализации. (Ведение журнала кажется мне любимой мозолью в мире 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
person eel ghEEz    schedule 27.01.2015