深入理解Logger日志——框架绑定原理

说到Logger日志的动态绑定 , 主要归功与Slf4j , 在之前的文章也说过 , Slf4j是类似于Apache Common-Logging , 英文为Simple Logging Facade , 是一个简单的日志门面适配器 , 所有的日志代码都可以用slf4j方式 , 它会根据项目具体依赖的日志实现包进行日志操作 , 只需修改pom.xml文件中的日志实现依赖 , 对于Log4j、Log4j2和Logback等都有相应的桥接包 , 对相应的slf4j-api接口实现 。
那么slf4j是如何自动绑定上的呢 。
多个框架是如何选择的呢 。
Slf4j框架架构原理日志的绑定原理主要是依赖Slf4j的静态加载 , 从相应的实现框架中获取Logger 。 需要自己动手一步步跟踪下去才会感触良多 。
Slf4j的实现流程 :
深入理解Logger日志——框架绑定原理文章插图
Logger日志打印调用流程:
深入理解Logger日志——框架绑定原理文章插图
在slf4j中主要是实现 LoggerFactoryBinder 的 StaticLoggerBinder 采用单例模式 , 编译时期静态加载方式 , 得到不同的ILoggerFactory工厂的实现类 , 最终拿到相应框架所匹配的Logger 。
对于 Slf4j的源码分析 我这边就不再过多的赘余 , 关键得自己去理解的看看 , 推荐一个: Java日志体系(slf4j)
介绍一下slf4j中主要的几个类的作用:

  • Logger: slf4j日志接口类 , 提供了trace < debug < info < warn < error这5个级别对应的方法 , 主要提供了占位符{}的日志打印方式;
  • Log4jLoggerAdapter: Logger适配器 , 主要对org.apache.log4j.Logger对象的封装 , 占位符{}日志打印的方式在此类中实现;
  • LoggerFactory: 日志工厂类 , 获取实际的日志工厂类 , 获取相应的日志实现对象;
  • lLoggerFactory: 底层日志框架中日志工厂的中介 , 再其实现类中 , 通过底层日志框架中的日志工厂获取对应的日志对象;
  • StaticLoggerBinder: 静态日志对象绑定 , 在编译期确定底层日志框架 , 获取实际的日志工厂 , 也就是lLoggerFactory的实现类;
项目中有多种日志框架时会存在多个StaticLoggerBinder时候获取第一个 , 主要是采用类的 顺序加载机制 ,与 Pom文件中依赖的填写顺序有关(个人实践得到)。
深入理解Logger日志——框架绑定原理文章插图
每一种日志框架都有相应的桥接包 。
首先先看Slf4j-api包结构: 主要定义了一些接口做相应的适配 , 其包结构主要是 org.slf4j 其他实现框架都是根据其进行相应的桥接
深入理解Logger日志——框架绑定原理文章插图
Log4j的桥接包形式: 相同包名 , StaticLoggerBinder采用构造器形式获取 Log4jLoggerFactory 工厂
深入理解Logger日志——框架绑定原理文章插图
Logback的桥接包形式: 相同包名 , 在StaticLoggerBinder调用时就已经静态初始化
Logback的详细配置:
深入理解Logger日志——框架绑定原理文章插图
Log4j2的桥接包形式: 相同包名 , 与Log4j类似采用构造器形式获取 Log4jLoggerFactory 工厂
Log4j2的详细配置:
Java日志体系(log4j2)
深入理解Logger日志——框架绑定原理文章插图
在官方文档中slf4j与其他日志框架如何绑定的示意图(大家都放我也放一下~)
深入理解Logger日志——框架绑定原理文章插图