SLF4J - Messages d'erreur
Dans ce chapitre, nous discuterons des différents messages d'erreur ou avertissements que nous recevons en travaillant avec SLF4J et des causes / significations de ces messages.
Échec du chargement de la classe «org.slf4j.impl.StaticLoggerBinder».
Il s'agit d'un avertissement qui se produit lorsqu'aucune liaison SLF4J n'est fournie dans le chemin de classe.
Voici l'avertissement complet -
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further
details.
Pour résoudre ce problème, vous devez ajouter l'une des liaisons de l'infrastructure de journalisation. Ceci est expliqué dans leHello world chapitre de ce tutoriel.
Note - Cela se produit dans les versions de SLF4J qui sont entre 1.6.0 et 1.8.0-beta2.
Aucun fournisseur SLF4J n'a été trouvé
Dans slf4j-1.8.0-beta2, l'avertissement ci-dessus est plus clair “No SLF4J providers were found”.
Voici l'avertissement complet -
SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#noProviders for further details.
Classpath contient des liaisons SLF4J ciblant les versions slf4j-api antérieures à 1.8
Si vous utilisez la version SLF4J 1.8 et que vous avez les liaisons des versions précédentes dans le chemin de classe mais pas les liaisons de 1.8, vous verrez un avertissement comme indiqué ci-dessous.
SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#noProviders for further details.
SLF4J: Class path contains SLF4J bindings targeting slf4j-api versions prior to
1.8.
SLF4J: Ignoring binding found at
[jar:file:/C:/Users/Tutorialspoint/Desktop/Latest%20Tutorials/SLF4J%20Tutorial/
slf4j-1.7.25/slf4j-jdk14-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#ignoredBindings for an explanation.
NoClassDefFoundError: org / apache / commons / logging / LogFactory
Si vous travaillez avec slf4j-jcl et si vous n'avez que slf4j-jcl.jar dans votre classpath, vous obtiendrez une exception telle que celle donnée ci-dessous.
Exception in thread "main" java.lang.NoClassDefFoundError:
org/apache/commons/logging/LogFactory
at org.slf4j.impl.JCLLoggerFactory.getLogger(JCLLoggerFactory.java:77)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:358)
at SLF4JExample.main(SLF4JExample.java:8)
Caused by: java.lang.ClassNotFoundException:
org.apache.commons.logging.LogFactory
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 3 more
Pour résoudre ce problème, vous devez ajouter commons-logging.jar à votre chemin de classe.
Détecté à la fois jcl-over-slf4j.jar ET lié slf4j-jcl.jar sur le chemin de classe.
La reliure slf4j-jcl.jar redirige les appels de l'enregistreur slf4j vers JCL et le jcl-over-slf4j.jarredirige les appels de l'enregistreur JCL vers slf4j. Par conséquent, vous ne pouvez pas avoir les deux dans le chemin de classe de votre projet. Si vous le faites, vous obtiendrez une exception telle que celle indiquée ci-dessous.
SLF4J: Detected both jcl-over-slf4j.jar AND bound slf4j-jcl.jar on the class
path, preempting StackOverflowError.
SLF4J: See also http://www.slf4j.org/codes.html#jclDelegationLoop for more
details.
Exception in thread "main" java.lang.ExceptionInInitializerError
at org.slf4j.impl.StaticLoggerBinder.<init>(StaticLoggerBinder.java:71)
at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:42)
at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)
at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357)
at SLF4JExample.main(SLF4JExample.java:8)
Caused by: java.lang.IllegalStateException: Detected both jcl-over-slf4j.jar
AND bound slf4j-jcl.jar on the class path, preempting StackOverflowError. See
also http://www.slf4j.org/codes.html#jclDelegationLoop for more details.
at org.slf4j.impl.JCLLoggerFactory.<clinit>(JCLLoggerFactory.java:54)
... 7 more
Pour résoudre ce problème, supprimez l'un des fichiers jar.
Non-concordance du nom de l'enregistreur détecté
Vous pouvez créer un objet Logger en -
Passer le nom de l'enregistreur à créer comme argument au getLogger() méthode.
Passer une classe comme argument à cette méthode.
Si vous essayez de créer l'objet de fabrique de journaux en transmettant une classe comme argument, et si vous avez défini la propriété système slf4j.detectLoggerNameMismatch à true, puis le nom de la classe que vous passez comme argument au getLogger() et la classe que vous utilisez doivent être les mêmes, sinon vous recevrez l'avertissement suivant -
«Non-concordance de nom d'enregistreur détectée.
Prenons l'exemple suivant.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SLF4JExample {
public static void main(String[] args) {
System.setProperty("slf4j.detectLoggerNameMismatch", "true");
//Creating the Logger object
Logger logger = LoggerFactory.getLogger(Sample.class);
//Logging the information
logger.info("Hi Welcome to Tutorilspoint");
}
}
Ici, nous avons défini la propriété slf4j.detectLoggerNameMismatch sur true. Le nom de la classe que nous avons utilisé estSLF4JExample et le nom de classe que nous avons passé à la méthode getLogger () est Sample comme ils ne sont pas tous les deux égaux, nous recevrons l'avertissement suivant.
SLF4J: Detected logger name mismatch. Given name: "Sample"; computed name:
"SLF4JExample".
SLF4J: See http://www.slf4j.org/codes.html#loggerNameMismatch for an
explanation
Dec 10, 2018 12:43:00 PM SLF4JExample main
INFO: Hi Welcome to Tutorilspoint
Note - Cela se produit après slf4j 1.7.9
Classpath contient plusieurs liaisons SLF4J.
Vous ne devriez avoir qu'une seule liaison dans le chemin de classe. Si vous disposez de plusieurs liaisons, vous recevrez un avertissement répertoriant les liaisons et leur emplacement.
Par exemple, si nous avons les liaisons slf4j-jdk14.jar et slf4j-nop.jar dans le classpath, nous obtiendrons l'avertissement suivant.
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in
[jar:file:/C:/Users/Tutorialspoint/Desktop/Latest%20Tutorials/SLF4J%20Tutorial/
slf4j-1.7.25/slf4j-nop-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in
[jar:file:/C:/Users/Tutorialspoint/Desktop/Latest%20Tutorials/SLF4J%20Tutorial/
slf4j-1.7.25/slf4j-jdk14-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an
explanation.
SLF4J: Actual binding is of type [org.slf4j.helpers.NOPLoggerFactory]
Détecté à la fois log4j-over-slf4j.jar ET lié slf4j-log4j12.jar sur le chemin de classe
Pour rediriger les appels du journal log4j vers slf4j, vous devez utiliser log4j-over-slf4j.jar liaison et si vous souhaitez rediriger les appels slf4j vers log4j, vous devez utiliser slf4j-log4j12.jar contraignant.
Par conséquent, vous ne pouvez pas avoir les deux dans le chemin de classe. Si vous le faites, vous obtiendrez l'exception suivante.
SLF4J: Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the
class path, preempting StackOverflowError.
SLF4J: See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more
details.
Exception in thread "main" java.lang.ExceptionInInitializerError
at org.slf4j.impl.StaticLoggerBinder.<init>(StaticLoggerBinder.java:72)
at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:45)
at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)
at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:383)
at SLF4JExample.main(SLF4JExample.java:8)
Caused by: java.lang.IllegalStateException: Detected both log4j-over-slf4j.jar
AND bound slf4j-log4j12.jar on the class path, preempting StackOverflowError.
See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more details.