SLF4J - Сообщения об ошибках

В этой главе мы обсудим различные сообщения об ошибках или предупреждения, которые мы получаем при работе с SLF4J, а также причины / значения этих сообщений.

Не удалось загрузить класс org.slf4j.impl.StaticLoggerBinder.

Это предупреждение, которое возникает, когда в пути к классам нет привязок SLF4J.

Ниже приводится полное предупреждение -

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.

Чтобы решить эту проблему, вам нужно добавить любую из привязок платформы ведения журнала. Это объясняется вHello world главу этого учебника.

Note - Это происходит в версиях SLF4J от 1.6.0 до 1.8.0-beta2.

Провайдеры SLF4J не найдены

В slf4j-1.8.0-beta2 приведенное выше предупреждение является более ясным, говоря “No SLF4J providers were found”.

Ниже приводится полное предупреждение -

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 содержит привязки SLF4J, нацеленные на версии slf4j-api до 1.8

Если вы используете версию SLF4J 1.8 и у вас есть привязки предыдущих версий в пути к классам, но нет привязок 1.8, вы увидите предупреждение, как показано ниже.

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

Если вы работаете с slf4j-jcl и если у вас есть только slf4j-jcl.jar в вашем пути к классам вы получите исключение, подобное приведенному ниже.

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

Чтобы решить эту проблему, вам нужно добавить commons-logging.jar к вашему пути к классам.

Обнаружены как jcl-over-slf4j.jar, так и привязанный slf4j-jcl.jar в пути к классам ..

Привязка slf4j-jcl.jar перенаправляет вызовы регистратора slf4j на JCL и jcl-over-slf4j.jarперенаправляет вызовы регистратора JCL на slf4j. Следовательно, у вас не может быть обоих в пути к классам вашего проекта. Если вы это сделаете, вы получите исключение, подобное приведенному ниже.

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

Чтобы решить эту проблему, удалите любой из файлов jar.

Обнаружено несоответствие имени регистратора

Вы можете создать объект Logger:

  • Передача имени создаваемого логгера в качестве аргумента в getLogger() метод.

  • Передача класса в качестве аргумента этому методу.

Если вы пытаетесь создать объект фабрики регистратора, передав класс в качестве аргумента, и если вы установили системное свойство slf4j.detectLoggerNameMismatch значение true, тогда имя класса, которое вы передаете в качестве аргумента getLogger() метод и класс, который вы используете, должны быть одинаковыми, иначе вы получите следующее предупреждение:

«Обнаружено несоответствие имени регистратора.

Рассмотрим следующий пример.

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

Здесь мы установили для свойства slf4j.detectLoggerNameMismatch значение true. Имя используемого нами класса:SLF4JExample а имя класса, которое мы передали методу getLogger (), - Sample поскольку они оба не равны, мы получим следующее предупреждение.

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 - Это происходит после slf4j 1.7.9

Путь к классам содержит несколько привязок SLF4J.

У вас должна быть только одна привязка в пути к классам. Если у вас несколько привязок, вы получите предупреждение со списком привязок и их местоположением.

Допустим, если у нас есть привязки slf4j-jdk14.jar и slf4j-nop.jar в пути к классам мы получим следующее предупреждение.

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]

Обнаружены как log4j-over-slf4j.jar, так и связанный slf4j-log4j12.jar на пути к классу

Чтобы перенаправить вызовы регистратора log4j на slf4j, вам необходимо использовать log4j-over-slf4j.jar привязка, и если вы хотите перенаправить вызовы slf4j на log4j, вам нужно использовать slf4j-log4j12.jar привязка.

Следовательно, в пути к классам не может быть обоих. Если вы это сделаете, вы получите следующее исключение.

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.