2012-01-06 14 views
7

Mam następującą strukturę katalogów w Tomcat 6:Gdybym pozbyć się moich wielorakich Wiązania slf4j "ostrzeżenie rejestrowanie przestanie działać

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 musi żyć w katalogu/lib tomcat ponieważ zawiera klasy potrzebne do uruchomienia tomcat jako zasobu globalnego. Zapisuje to logowanie do slf4j, więc potrzebuje także słoików slf4j i logback. Używa programu JoranConfigurator do załadowania pliku myStateLogback.xml.

Aplikacja webowa myApp zapisuje logowanie do rejestru commons, ale chcę, aby była ona przesyłana przez slf4j do logback w przygotowaniu do przeniesienia całego naszego logowania do slf4j, więc używam mostu jcl-over-slf4j.

Z powyższej konfiguracji, rejestrowania wszystko działa, ale pojawia się następujące ostrzeżenie na starcie:

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] 

Jeśli wezmę logback-klasyczne Spośród webapp za lib dir, otrzymuję następujący wyjątek:

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) 

jeśli usunąć 2 słoiki logback oraz slf4j-api.jar z katalogu lib webapp za, mam żadnego ostrzeżenia i bez wyjątków, ale logi z mojego webapp są zabierani przez plik myStateLogback.xml i idź do jego rejestratora, którego nie chcę. Wiem, że mogę odfiltrować oświadczenia, których nie chcę, ale chcę mieć oddzielne pliki konfiguracyjne dla aplikacji internetowej i słoika. Czy istnieje sposób, aby to osiągnąć?

Używam tomcat 6.0.23, logback 0.9.29 i slf4j 1.6.3.

Dzięki Sarah

Odpowiedz

3

Jest rozdział zatytułowany logging separation w documentaiton logback który stanowi jedno z możliwych rozwiązań.

+0

Dziękuję za to - bardzo interesujące i myślę, że zadziała w tej sytuacji. Jednak aby wszystko było proste, zdecydowaliśmy się użyć loginu tomcat juli dla pliku myState.jar, a następnie umieścić słoiki logback/slf4j w każdej aplikacji webapp, aby kontrolować własne rejestrowanie. – ssloan

1

Użycie nowej opcji -Dlogback.debug = true wyświetli wiadomości od czegoś, co wygląda jak slf4j-api szukający jego implementacji. (Logowanie dla mnie wygląda jak pet pee w świecie 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 [email protected] - 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 [email protected] - Registering current configuration as safe fallback point