我们在软件开发的时候总要去跟踪记录些东西,来观察一些变量在程序中的变化
日志框架的由来:
这里先讲个小故事:
小明是一名程序猿,有一天,他奉命开发一个大型系统,因此需要实时地观察程序的运行情况。
- 刚开始小明使用
System.out.println();
语句来直接打印出变量的情况,小明在每个变量使用之后都打印一遍。 - 终于系统开发完了,这时老板说:“控制台太多和项目无关的东西了,我只想要控制台干干净净的”,于是苦逼的小明只能一条一条的注释去了…
- 终于搞定了,
老板又来了一句:“之前那个好像挺不错的,还可以实时地监控程序的状况,你再加上吧”。
小明心里苦呀,想着谁让你是老板呢?于是这次小明想着不如我封装起来吧,下次如果需求改变的话,我这边修改也很方便。
于是小明开发出了一个框架xiaomingLogging.jar
- 终于完成了,小明以后开发别的项目也用着这个框架,但是小明他用着不舒服呀,他决定给这个日志框架加上几个高大上的功能。比如异步模式? 自动归档? 等等? 于是
xiaomingLogging_good.jar
问世了 - 这时小明想要把之前写的项目都用上新的框架,但是要修改原先的调用API,唉,也是个苦命活。改好之后,小明想着“我能不能抽取出来一个抽象层,这样以后面向接口编程,我就不用改动源码了?”
- 说干就干,
xiaomingLogging_abstract.jar
问世了,小明规定,以后的日志框架都实现这个抽象层,这样以后如果框架更新就不用去改动源码了!我们只需要给项目导入具体的日志实现类即可。
市面上的日志技术
故事到这里结束了,市面上就诞生了许许多多的日志技术。有一个非常受欢迎的日志抽象层,就是 slf4j
,别的日志抽象层也有,比如JCL
,jboss-logging
等等。但我们使用sfj4j
比较多。
日志实现技术有log4j,log4j2,logback,jul
等等log4j
因为前期设计有点小问题,后面新开发出了logback
,而log4j
也是在log4j
的基础上升级的,但就是因为太前卫了,所以比较难适配,jul
因为出现的比较早,并没有实现sfl4j
,log4j
也是一样,所以现在使用logback
比较多。
slf4j来管理日志
因为log4j,jul
等许许多多的日志实现类比slf4j
先问世的,所以它们并没有实现slf4j
这个时候只能小辈slf4j
来作出一些妥协了,我们去看slf4j的官网,可以在官网上看到一张图:
我们可以看第三四列,slf4j
为我们提供了一个适配的jar包,它可以连接log4和slf4j
,有了他我们就可以使用以前的日志实现类了。
以后开发的时候,日志记录方法的调用,不应该来直接调用日志的实现类,而是调用日志抽象层里面的方法。
但是这里有个遗留问题,SpringBoot的日志实现类使用logback
,而Spring使用log4j
,hibernate却使用jboss-logging
作为规范,它们之间并不统一,别担心,slf4j
早就为我们搞定了:
看图,可以看出slf4j
先是把其他框架所要用到的jar用中间包替换掉,而中间包其实还是调用slf4j
抽象层的方法,所以就完成了统一。
如何让系统中所有的日志都统一到slf4j;
1、将系统中其他日志框架先排除出去;
2、用中间包来替换原有的日志框架;
3、我们导入slf4j其他的实现
SpringBoot的决定
SpringBoot也是选用slf4j+logback
来管理日志。
每个启动器里面都依赖一个坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
我们点开maven的依赖图
可以看到logging底层也是使用slf4j+logback
的技术,并导入了log4j-to-slf4j+jul-to-slf4j这些中间适配jar包,保证能够完成日志技术的统一。
关于SpringBoot怎么具体使用日志框架开操作,会在下一篇博客介绍.