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 − 이것은 1.6.0과 1.8.0-beta2 사이의 SLF4J 버전에서 발생합니다.

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.

클래스 경로에는 1.8 이전의 slf4j-api 버전을 대상으로하는 SLF4J 바인딩이 포함되어 있습니다.

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.jarJCL 로거의 호출을 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 파일 중 하나를 삭제하십시오.

로거 이름 불일치 감지

다음과 같이 로거 객체를 만들 수 있습니다.

  • 생성 될 로거의 이름을 인수로 전달 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.jarslf4j-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.