$ 日志框架

$ 常见问题总结

  1. slf4j应该有且仅有一个绑定的日志框架.
  2. 通常slf4j的绑定是slf4j-nop.jar slf4j-simple.jar,slf4j-log4j12.jar, slf4j-jdk14.jar , logback-classic.jar中的一个.
  3. 如果在classpath中找不到相应的绑定则会打印Failed to load class org.slf4j.impl.StaticLoggerBinder的异常;
  4. 如果有多于一个的绑定,则会打印Multiple bindings were found on the class path的异常
  5. 设置slf4j.detectLoggerNameMismatch系统属性检查logger名称不匹配的问题.
  6. slf4j-api和相应的绑定包的版本应该保持一致.
  7. log4j-over-slf4j.jar用来把对log4j的调用重定向到slf4j,和slf4j-log4j12.jar混用会导致StackOverflowError.
  8. jcl-over-slf4j.jar用来把对JCL的调用重定向到slf4j,和slf4j-jcl.jar混用会导致StackOverflowError.
  9. 使用logback的时候,添加jul-to-slf4j`依赖将标准输出流重定向到日志中。

$ 参考

$ LoggerFactory初始化过程

  1. 检查classpath中是否有多个staticLoggerBinder并警告
  2. StaticLoggerBinder初始化
  3. 把状态置为SUCCESSFUL_INITIALIZATION
  4. 把SubstituteLogger委派给真实的logger
  5. 重演事件?
  6. 可能的检查logger名不一致

$ SPI机制

1.8版本的slf4j通过spi机制实现对具体日志框架的加载,避免了在slf4j-api包中去掉StaticLoggerBinder类的丑陋做法.

接口类是org.slf4j.spi.SLF4JServiceProvider,在绑定包中实现该接口,并在classpath的META-INFO/services/org.slf4j.spi.SLF4JServiceProvider文件中指明实现类的全类名.

更新时间: 1/25/2020, 4:21:59 AM