SLF4J - Fehlermeldungen

In diesem Kapitel werden die verschiedenen Fehlermeldungen oder Warnungen, die wir bei der Arbeit mit SLF4J erhalten, sowie die Ursachen / Bedeutungen dieser Meldungen erläutert.

Fehler beim Laden der Klasse "org.slf4j.impl.StaticLoggerBinder".

Dies ist eine Warnung, die ausgelöst wird, wenn im Klassenpfad keine SLF4J-Bindungen bereitgestellt werden.

Es folgt die vollständige Warnung -

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.

Um dies zu beheben, müssen Sie eine der Protokollierungsframework-Bindungen hinzufügen. Dies wird in der erklärtHello world Kapitel dieses Tutorials.

Note - Dies tritt in Versionen von SLF4J auf, die zwischen 1.6.0 und 1.8.0-beta2 liegen.

Es wurden keine SLF4J-Anbieter gefunden

In slf4j-1.8.0-beta2 ist die obige Warnung klarer “No SLF4J providers were found”.

Es folgt die vollständige Warnung -

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 enthält SLF4J-Bindungen für slf4j-api-Versionen vor 1.8

Wenn Sie die SLF4J 1.8-Version verwenden und die Bindungen früherer Versionen im Klassenpfad haben, jedoch nicht die Bindungen 1.8, wird eine Warnung angezeigt (siehe unten).

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

Wenn Sie mit arbeiten slf4j-jcl und wenn du nur hast slf4j-jcl.jar In Ihrem Klassenpfad erhalten Sie eine Ausnahme wie die unten angegebene.

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

Um dies zu beheben, müssen Sie hinzufügen commons-logging.jar zu deinem Klassenpfad.

Es wurde sowohl jcl-over-slf4j.jar als auch gebundenes slf4j-jcl.jar im Klassenpfad erkannt.

Die Bindung slf4j-jcl.jar leitet Aufrufe des slf4j-Loggers an JCL und den um jcl-over-slf4j.jarleitet Aufrufe des JCL-Loggers an slf4j weiter. Daher können Sie nicht beide im Klassenpfad Ihres Projekts haben. Wenn Sie dies tun, erhalten Sie eine Ausnahme wie die unten angegebene.

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

Um dies zu beheben, löschen Sie eine der JAR-Dateien.

Nicht übereinstimmende Loggernamen erkannt

Sie können ein Logger-Objekt erstellen, indem Sie -

  • Übergabe des Namens des zu erstellenden Loggers als Argument an die getLogger() Methode.

  • Übergeben einer Klasse als Argument an diese Methode.

Wenn Sie versuchen, das Logger-Factory-Objekt durch Übergeben einer Klasse als Argument zu erstellen, und wenn Sie die Systemeigenschaft festgelegt haben slf4j.detectLoggerNameMismatch zu true, dann der Name der Klasse, die Sie als Argument an die übergeben getLogger() Methode und die von Ihnen verwendete Klasse sollten identisch sein, andernfalls erhalten Sie die folgende Warnung:

„Erkennung einer Nichtübereinstimmung des Loggernamens festgestellt.

Betrachten Sie das folgende Beispiel.

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");
   }
}

Hier haben wir die Eigenschaft slf4j.detectLoggerNameMismatch auf true gesetzt. Der Name der Klasse, die wir verwendet haben, istSLF4JExample und der Klassenname, den wir an die Methode getLogger () übergeben haben, lautet Sample Da beide nicht gleich sind, erhalten wir die folgende Warnung.

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 - Dies geschieht nach slf4j 1.7.9

Der Klassenpfad enthält mehrere SLF4J-Bindungen.

Sie sollten nur eine Bindung im Klassenpfad haben. Wenn Sie mehr als eine Bindung haben, erhalten Sie eine Warnung, in der die Bindungen und ihre Positionen aufgeführt sind.

Nehmen wir an, wir haben die Bindungen slf4j-jdk14.jar und slf4j-nop.jar Im Klassenpfad erhalten wir die folgende Warnung.

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]

Es wurde sowohl log4j-over-slf4j.jar als auch gebundenes slf4j-log4j12.jar im Klassenpfad erkannt

Um die log4j-Logger-Aufrufe an slf4j umzuleiten, müssen Sie verwenden log4j-over-slf4j.jar Bindung und wenn Sie slf4j-Aufrufe an log4j umleiten möchten, müssen Sie verwenden slf4j-log4j12.jar Bindung.

Daher können Sie nicht beide im Klassenpfad haben. Wenn Sie dies tun, erhalten Sie die folgende Ausnahme.

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.