介绍
SLF4J API可以适配很多日志框架,但是能绑定(bind)有且只能一个日志框架。如果在classpath中有不止一个可绑定的框架,那么SLF4J会打印一个警告(warning),并且列出所有的可绑定框架。
警告信息如下:
SLF4J: Class path contains multiple SLF4J bindings.
虽然遇到了multiple binding,但是SLF4J还是会选取一个日志框架的。选取哪个呢?官网上如下说:
he way SLF4J picks a binding is determined by the JVM and for all practical purposes should be considered random
说白了,基本上是随机选择。
如果选取的日志框架不是你期望的日志框架,极有可能会出现未知的错误。
例子
在一个project中同时使用了log4j和log4j2日志框架,期望使用log4j2,并且在resources中有log4j2.xml配置。
工程在启动时,发现日志怎么也打印不出来,但是服务成功启动了。看不到错误日志,找问题很困难,也很崩溃。
后来静下心一想,既然服务起来了,但是日志打印不出来,那么久有可能是日志的问题。
在启动控制台中查看信息,发现了这么一行日志:
log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
问题来了,这几行日志显示的是使用log4j做为日志框架,而不是期望的log4j2。log4j的配置文件默认是log4j.xml,这个在classpath中是完全不存在的。由此可见,确实是日志的问题。
再查打印信息,又看到如下几行日志:
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/webroot/WEB-INF/lib/log4j-slf4j-impl-2.7.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/webroot/WEB-INF/lib/slf4j-log4j12-1.7.21.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.apache.logging.slf4j.Log4jLoggerFactory]
很明显,SLF4J遇到的multiple binding问题,并且选择了错误的日志框架!
知道了问题所在,解决起来就非常容易了:通过mvn dependency分析依赖,并将slf4j-log4j12全部exclude掉就可以了。
网友评论