Incompatibilidad del marco de registro

109

Estoy construyendo una pequeña aplicación Java y espero usar logback para registrar.

Mi aplicación depende de un proyecto anterior que realiza su registro a través de

org.apache.commons | com.springsource.org.apache.commons.logging | 1.1.1

... entonces mi plan era usar

org.slf4j | jcl-over-slf4j | 1.5.6

... para redirigir el registro JCL a

org.slf4j | slf4j-api | 1.6.0

... y finalmente a

ch.qos.logback | logback-classic | 0.9.22
ch.qos.logback | logback-core | 0.9.22

para que mi aplicación pueda iniciar sesión a través de logback a través de su API slf4j, mientras que el código de la biblioteca anterior puede iniciar sesión en la misma ubicación a través de la redirección.

Por desgracia, esto resulta en

java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;Ljava/lang/Throwable;)V
at   org.apache.commons.logging.impl.SLF4JLocationAwareLog.info(SLF4JLocationAwareLog.java:141)

Probé números de versión más altos y más bajos en algunos de estos frascos y también busqué en la documentación de la API y demás ... pero no puedo encontrar y resolver el problema.

¿Ayuda por favor?

Aunque el logback se considera el marco de registro "estratégico", tengo cierto margen en el mecanismo de registro que finalmente uso. Sin embargo, espero usar logback o log4j, y definitivamente quiero fusionar el inicio de sesión del proyecto antiguo en lo que sea que el marco de registro "nuevo" termine siendo, a través de una configuración común.

Carl Smotricz
fuente

Respuestas:

111

Está mezclando la versión 1.5.6 del puente jcl con la versión 1.6.0 de slf4j-api; esto no funcionará debido a algunos cambios en 1.6.0. Utilice las mismas versiones para ambos, es decir, 1.6.1 (la última). Utilizo el puente jcl-over-slf4j todo el tiempo y funciona bien.

Holger Hoffstätte
fuente
2
Eso funcionó de inmediato, por supuesto; ¡muchas gracias! No había usado 1.6.1 de esos frascos porque no parecían estar disponibles. Estoy muy molesto con m2eclipse, que pretende mostrarme todas las versiones disponibles, pero misteriosamente deja caer un número significativo de ellas.
Carl Smotricz
1
Solo para el interés de cualquiera que me siga: terminé con una flecha roja en el gráfico de dependencia porque incluso el último logback-core insiste en slf4j-1.6.0. Tomó un poco más de jugar con las versiones hasta que desaparecieron todas las flechas rojas, pero ahora funciona y todas las flechas azules.
Carl Smotricz
1
¿Cómo hago eso exactamente?
user1721803
Gracias ... Usar el 'jcl-over-slf4j' me salvó el día.
Tariq M Nasim
41

Las versiones de SLF4J 1.5.11 y 1.6.0 no son compatibles (ver informe de compatibilidad ) porque la lista de argumentos del org.slf4j.spi.LocationAwareLogger.logmétodo ha sido cambiada (Objeto agregado [] p5):

SLF4J 1.5.11:

LocationAwareLogger.log ( org.slf4j.Marker p1, String p2, int p3,
                          String p4, Throwable p5 )

SLF4J 1.6.0:

LocationAwareLogger.log ( org.slf4j.Marker p1, String p2, int p3,
                          String p4, Object[] p5, Throwable p6 )

Consulte los informes de compatibilidad para otras versiones de SLF4J en esta página .

Puede generar dichos informes con la herramienta japi-compliance-checker .

ingrese la descripción de la imagen aquí

linuxbuild
fuente
23

Solo para ayudar a aquellos en una situación similar a la mía ...

Esto puede ocurrir cuando una biblioteca dependiente ha empaquetado accidentalmente una versión anterior de slf4j. En mi caso, fue tika-0.8. Ver https://issues.apache.org/jira/browse/TIKA-556

La solución es excluir el componente y luego depender manualmente de la versión correcta o parcheada.

P.EJ.

    <dependency>
        <groupId>org.apache.tika</groupId>
        <artifactId>tika-parsers</artifactId>
        <version>0.8</version>
        <exclusions>
            <exclusion>
                <!-- NOTE: Version 4.2 has bundled slf4j -->
                <groupId>edu.ucar</groupId>
                <artifactId>netcdf</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <!-- Patched version 4.2-min does not bundle slf4j -->
        <groupId>edu.ucar</groupId>
        <artifactId>netcdf</artifactId>
        <version>4.2-min</version>
    </dependency>
Peter L
fuente
¡Gracias! ¡Me golpeó esto cuando intentaba usar Jackrabbit 2.2.5 con SLF4J 1.6.1 y Logback 0.9.28!
Hendy Irawan
Gracias. Me vinculé
Hendy Irawan