У меня есть следующая структура каталогов в 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, поэтому также нужны файлы jar 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 jar-файла logback и файл slf4j-api.jar из каталога lib веб-приложения, я не получаю никаких предупреждений и исключений, но логи из моего веб-приложения выбираются файлом myStateLogback.xml и переходят к это регистратор, который я не хочу. Я знаю, что могу отфильтровать нежелательные утверждения, но я хочу иметь отдельные файлы конфигурации для веб-приложения и фляги. Есть ли способ добиться этого?
Я использую Tomcat 6.0.23, logback 0.9.29 и slf4j 1.6.3.
Спасибо,
Сара