当前位置: 首页 > 工具软件 > c-log > 使用案例 >

log4j日志实现重复警告slf4j-log4j12和log4j-slf4j-impl

廖永长
2023-12-01

因为各种三方库依赖的log4j实现不同,所以可能会出现找到多个log4j实现的警告,但是不影响程序(logback是会影响的),如下:

SLF4J: Class path contains multiple SLF4J bindings.  
SLF4J: Found binding in [jar:file:/D:/software/slf4j-log4j12-1.7.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]  
SLF4J: Found binding in [jar:file:/D:/software/log4j-slf4j-impl-2.4.1.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.impl.Log4jLoggerFactory]

  这通常是因为同时包含了slf4j-log4j12和log4j-slf4j-impl,所以去掉slf4j-log4j12,保留log4j-slf4j-impl即可

 

分析:

  • 在开发环境,先加载的是 log4j-slf4j-impl,后加载的是slf4j-log4j12。而生产环境,先加载的是 slf4j-log4j12,后加载的是log4j-slf4j-impl。
  • 通过查阅官方资料发现slf4j在绑定时,如果有多个可以绑定的包, SLF4J选择绑定的方式由JVM确定,并且出于所有实际目的应该被认为是随机的
  • 但是,经过我12次在slf4j源码打断点测试发现slf4j优先绑定先加载的jar包。所以在开发环境slf4j绑定的是log4j-slf4j-impl这个jar包,而在生产环境中绑定的是slf4j-log4j12这个jar包。
  • 通过查阅log4j2官方资料可知,slf4j集成log4j2时需要的桥接包是 log4j-slf4j-impl开发环境中slf4j绑定是正确的,因此可以打印日志。而生产环境中slf4j绑定的jar包是slf4j-log4j12。所以生产环境输出不了日志。产生这个问题的根本原因是lib里面有多个了slf4j可绑定的jar包。

小结:

使用SLF4j+Log4j2时使用的桥接包是log4j-slf4j-impl, 当有多个SLF4j的桥接包时,一定要排除不需要的包

 类似资料: