深入理解Logger日志——框架绑定原理
说到Logger日志的动态绑定 , 主要归功与Slf4j , 在之前的文章也说过 , Slf4j是类似于Apache Common-Logging , 英文为Simple Logging Facade , 是一个简单的日志门面适配器 , 所有的日志代码都可以用slf4j方式 , 它会根据项目具体依赖的日志实现包进行日志操作 , 只需修改pom.xml文件中的日志实现依赖 , 对于Log4j、Log4j2和Logback等都有相应的桥接包 , 对相应的slf4j-api接口实现 。
那么slf4j是如何自动绑定上的呢 。
多个框架是如何选择的呢 。
Slf4j框架架构原理日志的绑定原理主要是依赖Slf4j的静态加载 , 从相应的实现框架中获取Logger 。 需要自己动手一步步跟踪下去才会感触良多 。
Slf4j的实现流程 :
文章插图
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的实现类;
文章插图
每一种日志框架都有相应的桥接包 。
首先先看Slf4j-api包结构: 主要定义了一些接口做相应的适配 , 其包结构主要是 org.slf4j 其他实现框架都是根据其进行相应的桥接
文章插图
Log4j的桥接包形式: 相同包名 , StaticLoggerBinder采用构造器形式获取 Log4jLoggerFactory 工厂
文章插图
Logback的桥接包形式: 相同包名 , 在StaticLoggerBinder调用时就已经静态初始化
Logback的详细配置:
文章插图
Log4j2的桥接包形式: 相同包名 , 与Log4j类似采用构造器形式获取 Log4jLoggerFactory 工厂
Log4j2的详细配置:
Java日志体系(log4j2)
文章插图
在官方文档中slf4j与其他日志框架如何绑定的示意图(大家都放我也放一下~)
文章插图
推荐阅读
- 全新8核国产CPU深入探秘:马上能买到
- 数据|新基建时代,高大全的数据管理解决方案是怎样“炼”成的?
- 16G运存+256G内存,专业骁龙865旗舰,性价比深入人心
- “我”由我掌镜:华为nova8 Pro瞄向Vlogger助力成就Vlog达人
- 深入理解Netty编解码、粘包拆包、心跳机制
- 绿色骑行深入校园,共享单车长途长时需求量提升
- 不被理解的超时代发明,你知道几个?在线膜拜大神,西瓜视频真相
- 深入调查SolarWinds黑客事件 微软已查封一个核心服务器
- 《深入理解Java虚拟机》:Java内存区域
- 深入探讨 JavaScript 逻辑赋值运算符