Tengo la siguiente estructura de directorios en Tomcat 6:Si me deshago de mis 'varios enlaces SLF4J' advirtiendo al registro deja de funcionar
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 necesita vivir en el directorio de Tomcat/lib ya que contiene las clases necesarias en el arranque de tomcat como recurso global. Escribe que está iniciando sesión en slf4j, por lo que también necesita los archivos slf4j y logback. Utiliza un JoranConfigurator para cargar myStateLogback.xml.
myApp webapp escribe que está registrando en commons-logging, pero quiero que pase a través de slf4j a logback en preparación para mover todo nuestro registro a slf4j, entonces estoy usando el puente jcl-over-slf4j.
Con la configuración anterior, el registro de todos los trabajos, pero me da la siguiente advertencia al inicio:
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]
Si saco logback-clásico de la dir lib de la aplicación web, me sale el siguiente excepción:
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)
Si quito los 2 frascos logback, y el slf4j-api.jar del directorio lib de la aplicación web, me sale ninguna advertencia y no hay excepciones, pero los registros de mi aplicación web son recogidos por el archivo myStateLogback.xml e ir a su registrador, que no quiero. Sé que puedo filtrar las declaraciones que no quiero, pero quiero tener los archivos de configuración separados para la aplicación web y el frasco. ¿Hay una manera de lograr esto?
estoy usando Tomcat 6.0.23, logback versión 0.9.29 y 1.6.3 slf4j.
Gracias, Sarah
Gracias por eso, muy interesante y creo que funcionaría en esta situación. Sin embargo, para mantener las cosas simples que hemos decidido utilizar las Juli Tomcat madereras para myState.jar y luego poner los frascos logback/SLF4J en cada aplicación web para ellos controlar su propio registro. – ssloan