Java 日志框架slf4j

了解日志框架

Java日志框架:slf4j作用及其实现原理
Java日志系统历史从入门到崩溃

常见的日志产品

SLF4j框架通过扫描classpath下面的org/slf4j/impl/StaticLoggerBinder.class类来发现日志产品jar,一般用到的日志jar 有logback、log4j2。如下是是SLF4j框架对接各个日志产品的依赖。

  • slf4j-api 是SLF4j的框架API
  • logback和slf4j-simple都是直接实现SLF4j框架的接口
  • log4j 不是直接实现SLF4j接口,因此需要一个桥接jar,即slf4j-log4j12
  • log4j2 和logj类似,也需要一个桥接的jar,即log4j-slf4j-impl,注意这个jar和log4j不一样。此外log4j2本身由两个jar组成,即log4j-api和log4j-core
    
        
        
            org.slf4j
            slf4j-api
            1.7.25
        

        
        
            ch.qos.logback
            logback-classic
            1.2.3
        

        
        
            org.slf4j
            slf4j-simple
            1.7.25
        

        
        
            org.slf4j
            slf4j-log4j12
            1.7.21
        
        
            log4j
            log4j
            1.2.17
        
        

        
        
            org.apache.logging.log4j
            log4j-slf4j-impl
            2.11.0
        
        
            org.apache.logging.log4j
            log4j-api
            2.12.1
        
        
            org.apache.logging.log4j
            log4j-core
            2.12.1
        
        
    

SLF4J如何进行SPI

SPI的全称是Service Provider Interface,是Java提供的可用于第三方实现和扩展的机制,通过该机制,我们可以实现解耦,SPI接口方负责定义和提供默认实现,SPI调用方可以按需扩展。

一般classpath下只有一种日志实现,一般常用logback或log4j2,假如classpath有多个日志实现,会怎样?SLF4j到底会选择哪一个?
如果有多个日志实现,SLF4j会打印日志,告诉使用者当前有多个日志实现jar,并且显示当前使用的是哪个,如下图,classpath下有logback,slf4j-simple,log4j,log4j2 4个日志实现;并且binding 使用logback。
image.png

我们走读源码,也看不出来到底在哪个地方选择logback。实际上,日志logback的选择不是通过代码来控制的,应该是通过java类加载机制来确定的,因为4个日志实现都包含同一个类org.slf4j.impl.StaticLoggerBinder.class,而jvm对于同一个类,只会加载一次,加载到哪个日志实现的StaticLoggerBinder就用那个日志实现。

SLF4j通过类加载来实现SPI发现日志产品。这种SPI方法很巧妙,奇特。

日志跟踪相关

MDC(Mapped Diagnostic Context,映射调试上下文)是Slf4j(提供了接口定义和核心实现,日志库负责适配器的实现)提供的一种方便在多线程条件下记录日志的功能。
log4j2 的 ThreadContext

你可能感兴趣的:(Java 日志框架slf4j)