spring5通用日志框架
spring5通用日志框架
iamxunspring5通用日志框架
- 各种日志技术的关系和作用
- 通过源码来分析spring的日志技术
- commons-logging源码分析
- 通过源码分析mybaits的日志技术
- 架构系统时候如何选择、优化日志技术
主流的log技术名词
- log4j
1 | <!--<dependency>--> |
可以不需要依赖第三方的技术 直接记录日志
- jcl
jakartaCommonsLoggingImpl
1 | <dependency> |
jcl他不直接记录日志,他是通过第三方记录日志(jul) 如果使用jcl来记录日志,在没有log4j的依赖情况下,是用jul
如果有了log4j则使用log4j
1 | jcl=Jakarta commons-logging ,是apache公司开发的一个抽象日志通用框架,本身不实现日志记录,但是提供了记录日志的抽象方法即接口(info,debug,error.......),底层通过一个数组存放具体的日志框架的类名,然后循环数组依次去匹配这些类名是否在app中被依赖了,如果找到被依赖的则直接使用,所以他有先后顺序。 |
1 | 上图为jcl中存放日志技术类名的数组,默认有四个,后面两个可以忽略。 |
1 | 上图81行就是通过一个类名去load一个class,如果load成功则直接new出来并且返回使用。 |
1 | 可以看到这里的循环条件必须满足result不为空, |
- jul
java自带的一个日志记录的技术,直接使用
- log4j2
- slf4j
slf4j他也不记录日志,通过绑定器绑定一个具体的日志记录来完成日志记录
1 | log4j---<artifactId>slf4j-log4j12</artifactId> |
- logback
- simple-log
各种日志技术的关系和作用
spring日志技术分析
spring5.*日志技术实现
spring5使用的spring的jcl(spring改了jcl的代码)来记录日志的,但是jcl不能直接记录日志,采用循环优先的原则
spring4.*日志技术实现
spring4当中依赖的是原生的jcl
mybatis的日志技术实现
初始化
org.apache.ibatis.logging.LogFactory
1 | tryImplementation(new Runnable() { |
关键代码 ** if (logConstructor == null)****,**没有找到实现则继续找
1 | private static void tryImplementation(Runnable runnable) { |
具体实现类
mybatis提供很多日志的实现类,用来记录日志,取决于初始化的时候load到的class
1 | 上图红色箭头可以看到JakartaCommonsLoggingImpl |
自己模拟实现mybaits的日志实现
1 | mybatis的官网关于日志的介绍 |
架构系统如何考虑日志
old:jcl+log4j
new:slf4j+jul