110 votes

Incompatibilité du cadre de journalisation

Je suis en train de construire une petite application Java et j'espère utiliser logback pour la journalisation.

Mon application dépend d'un ancien projet qui effectue la journalisation par le biais de

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

...donc mon plan était d'utiliser

org.slf4j | jcl-over-slf4j | 1.5.6

...pour rediriger la journalisation du JCL vers

org.slf4j | slf4j-api | 1.6.0

...et finalement à

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

Ainsi, mon application peut se connecter à travers logback via son API slf4j tandis que l'ancien code de la bibliothèque peut se connecter au même endroit via la redirection.

Hélas, il en résulte

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)

J'ai essayé d'augmenter et de diminuer les numéros de version de certains de ces jars et j'ai également cherché dans la documentation de l'API et autres... mais je ne parviens pas à trouver et à résoudre le problème.

De l'aide, s'il vous plaît ?

Bien que logback soit considéré comme le cadre de journalisation "stratégique", j'ai une certaine marge de manœuvre dans le choix du mécanisme de journalisation que j'utiliserai finalement. J'espère cependant utiliser soit logback, soit log4j, et je veux absolument fusionner la journalisation de l'ancien projet avec le "nouveau" cadre de journalisation, quel qu'il soit, via une configuration commune.

113voto

Holger Hoffstätte Points 1495

Vous mélangez la version 1.5.6 du pont jcl avec la version 1.6.0 de l'interface slf4j-api ; cela ne fonctionnera pas à cause de quelques changements dans la version 1.6.0. Utilisez les mêmes versions pour les deux, c'est-à-dire la 1.6.1 (la plus récente). J'utilise le pont jcl-over-slf4j tout le temps et cela fonctionne bien.

2 votes

Cela a fonctionné tout de suite, bien sûr ; merci beaucoup ! Je n'avais pas utilisé la version 1.6.1 de ces jars car ils ne semblaient pas être disponibles. Je suis très ennuyé par m2eclipse, qui prétend me montrer toutes les versions disponibles mais qui, mystérieusement, en laisse tomber un grand nombre.

1 votes

Juste pour l'intérêt de tous ceux qui suivent : Je me suis retrouvé avec une flèche rouge dans le graphique des dépendances car même la dernière version de logback-core insiste sur slf4j-1.6.0. Il m'a fallu jouer avec les versions jusqu'à ce que toutes les flèches rouges disparaissent, mais maintenant tout fonctionne et toutes les flèches sont bleues.

1 votes

Comment je fais ça exactement.

41voto

aponomarenko Points 6966

Les versions SLF4J 1.5.11 et 1.6.0 ne sont pas compatibles (cf. rapport de compatibilité ) parce que la liste des arguments de org.slf4j.spi.LocationAwareLogger.log a été modifiée (ajout de l'objet[] 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 )

Voir les rapports de compatibilité pour les autres versions de SLF4J sur cette page .

Vous pouvez générer de tels rapports à l'aide de la fonction japi-compliance-checker outil.

enter image description here

23voto

Peter L Points 474

Juste pour aider ceux qui sont dans une situation similaire à la mienne...

Cela peut être causé lorsqu'une bibliothèque dépendante a accidentellement intégré une ancienne version de slf4j. Dans mon cas, c'était tika-0.8. Voir https://issues.apache.org/jira/browse/TIKA-556

La solution de contournement consiste à exclure le composant, puis à dépendre manuellement de la version correcte ou corrigée.

EG.

<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>

0 votes

Merci. J'ai été confronté à ce problème en essayant d'utiliser Jackrabbit 2.2.5 avec SLF4J 1.6.1 et Logback 0.9.28 !

0 votes

Merci. J'ai mis un lien vers votre réponse ici : printemps-java-ee.blogspot.com/2011/04/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X