介绍
结合译文https://www.slf4j.org/codes.html和目前使用slf4j遇到的问题整理成文。
译文来源
Failed to load class org.slf4j.impl.StaticLoggerBinder
原因和含义
当
org.slf4j.impl.StaticLoggerBinder
类没能被加载到内存中会给出warning信息,原因是在class path下没有找到合适的SLF4J绑定。解决方法
在class path放置如下Jar包中的一个且只有一个:
slf4j-nop.jar*
slf4j-simple.jar,
slf4j-log4j12.jar,
slf4j-jdk14.jar
logback-classic.jar
以gradle加载为例,添加依赖
dependencies {
...
// slf4j-nop.jar slf4j-simple.jar, slf4j-log4j12.jar, slf4j-jdk14.jar, logback-classic.jar
compile("ch.qos.logback:orlogback-classic:1.1.11")
}
Multiple bindings were found on the class path
原因和含义
SLF4J API 被设计为绑定一个且只有一个底层日志框架,当发现多个时会产生warning信息。常见的情况是加载的三方包之间产生冲突。
解决方法
选择一个绑定,移除其他绑定。
以gradle加载为例,利用exclude移除三方包中的依赖
dependencies {
...
//如三方包之间冲突,移除三方包hadoop-common中的依赖
compile("org.apache.hadoop:hadoop-common:2.7.4") {
exclude module : 'slf4j-log4j12'
}
}
Logging factory implementation cannot be null
原因和含义
当
LoggerFactory
在class path下没有找到合适的SLF4J绑定,给出error信息解决方法
在class path放置如下Jar包中的一个且只有一个:
slf4j-nop.jar*
slf4j-simple.jar,
slf4j-log4j12.jar,
slf4j-jdk14.jar
logback-classic.jar
以gradle加载为例,添加依赖
dependencies {
...
// slf4j-nop.jar slf4j-simple.jar, slf4j-log4j12.jar, slf4j-jdk14.jar, logback-classic.jar
compile("ch.qos.logback:orlogback-classic:1.1.11")
}
Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting StackOverflowError
.
原因和含义
当SLF4J 绑定了lf4j-log4j12.jar 和 log4j-over-slf4j.jar会出现StackOverflowError(栈溢出)的错误。
Exception in thread "main" java.lang.StackOverflowError
at java.util.Hashtable.containsKey(Hashtable.java:306)
at org.apache.log4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:36)
at org.apache.log4j.LogManager.getLogger(LogManager.java:39)
解决方法
我当时遇到这种问题,解决方法是去掉lf4j-log4j12.jar 或 log4j-over-slf4j.jar其中的一个依赖,仅保留一个。
dependencies {
...
//删除其中一个依赖
compile('org.slf4j:slf4j-log4j12:1.7.25')
//compile('org.slf4j:log4j-over-slf4j:1.7.25')
}
java.lang.NoClassDefFoundError: org/slf4j/event/LoggingEvent
原因和含义
slf4j-api 版本较低导致。Logback-classic 1.1.4版本或更新的版本,需要slf4j-api 1.7.15版本及以上
Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/event/LoggingEvent at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2451) at java.lang.Class.privateGetPublicMethods(Class.java:2571) at java.lang.Class.getMethods(Class.java:1429)
解决方法
更新slf4j-api.jar 版本到1.7.15或更新的版本
dependencies {
...
//更新版本
compile('org.slf4j:slf4j-api:1.7.25)
}