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”章节对此进行了解释。
注意- 这发生在 1.6.0 和 1.8.0-beta2 之间的 SLF4J 版本中。
未找到 SLF4J 提供程序
在 slf4j-1.8.0-beta2 中,上述警告更加明确,表示“未找到 SLF4J 提供程序”。
以下是完整的警告 -
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设置为 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
注意- 这发生在 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.