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.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 为真,然后是您作为参数传递给 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.