slf4j 错误消息——迹忆客-ag捕鱼王app官网
在本章中,我们将讨论在使用 slf4j 时收到的各种错误消息或警告以及这些消息的原因/含义。
failed to load class "org.slf4j.impl.staticloggerbinder".
这是在 classpath
中没有提供 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.
要解决此问题,我们需要添加任一日志框架绑定。 这在本教程的 slf4j 示例章节中进行了解释。
注意
- 这发生在 1.6.0 和 1.8.0-beta2 之间的 slf4j 版本中。
no slf4j providers were found
在 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 contains slf4j bindings targeting slf4j-api versions prior to 1.8
如果我们使用的是 slf4j 1.8 版本,并且 classpath
中有以前版本的绑定,但没有 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:/workspace/java/latest tutorials/slf4j tutorial/
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
并且如果 classpath
中只有 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
添加到 classpath
中。
detected both jcl-over-slf4j.jar and bound slf4j-jcl.jar on the classpath..
绑定 slf4j-jcl.jar
将 slf4j logger 的调用重定向到 jcl,而 jcl-over-slf4j.jar
将 jcl logger 的调用重定向到 slf4j。 因此,我们不能在项目的 classpath 中同时拥有这两者。 如果这样做,我们会得到一个异常,如下所示。
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.(staticloggerbinder.java:71)
at org.slf4j.impl.staticloggerbinder.(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.(jclloggerfactory.java:54)
... 7 more
要解决此问题,请删除其中一个 jar 文件。
detected logger name mismatch
我们可以通过以下方式创建 logger 对象:
- 将要创建的 logger 的名称作为参数传递给
getlogger()
方法。 - 将类作为参数传递给此方法。
如果我们尝试通过将类作为参数传递来创建 logger factory 对象,并且我们已将系统属性 slf4j.detectloggernamemismatch
设置为 true,那么我们作为参数传递给 getlogger()
方法的类的名称和我们使用的类名应该相同,否则我们将收到以下警告 -
“detected logger name mismatch”
考虑以下示例。
import org.slf4j.logger;
import org.slf4j.loggerfactory;
public class slf4jexample {
public static void main(string[] args) {
system.setproperty("slf4j.detectloggernamemismatch", "true");
// 创建 logger 对象
logger logger = loggerfactory.getlogger(sample.class);
// 记录信息
logger.info("hi 欢迎来到 迹忆客");
}
}
在这里,我们将 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 欢迎来到 迹忆客
注意
- 这发生在 slf4j 1.7.9 之后
classpath contains multiple slf4j bindings.
我们应该在 classpath
中只有一个绑定。 如果我们有多个绑定,将收到列出绑定及其位置的警告。
假设,如果我们在 classpath
中有绑定 slf4j-jdk14.jar
和 slf4j-nop.jar
,我们将收到以下警告。
slf4j: class path contains multiple slf4j bindings.
slf4j: found binding in
[jar:/worksapce/java/latest tutorials/slf4j tutorial/
slf4j-1.7.25/slf4j-nop-1.7.25.jar!/org/slf4j/impl/staticloggerbinder.class]
slf4j: found binding in
[jar:/worksapce/java/latest tutorials/slf4j tutorial/
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]
detected both log4j-over-slf4j.jar and bound slf4j-log4j12.jar on the class path
要将 log4j logger 调用重定向到 slf4j,我们需要使用 log4j-over-slf4j.jar
绑定,如果要将 slf4j 调用重定向到 log4j,则需要使用 slf4j-log4j12.jar
绑定。
因此,我们不能在 classpath
中同时拥有这两者。 如果这样做,我们将收到以下异常。
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.(staticloggerbinder.java:72)
at org.slf4j.impl.staticloggerbinder.(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.