一:市面上的日志框架:
JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j....
左边是日志门面(抽象层)、右边是日志的实现:
日志门面(日志抽象层) | 日志实现 |
JCL(Jakarta Commons Logging) SLF4j(Simple Logging Facade for Java) jboss-logging |
Log4j JUL(java.util.logging) Log4j2 Logback |
1.日志门面对比,以及springboot的日志门面选择:
JCL:Jakarta Commons Logging,是Apache公司给我们的commons-logging包。是apache旗下Jakarta小组开发的,所以叫Jakarta Commons Logging两个基本的抽象类:Log(基本记录器)和LogFactory(负责创建Log实例)
最后一次更新是2014年,廉颇老矣,尚能饭否,现在已经很少使用了
jboss-logging:使用的场景太少了,普通的业务开发很少用,都是特定的框架在用,eg:hibernate框架
SLF4j:Simple Logging Facade for Java,简单的日志门面
所以springboot最终的日志门面选择:slf4j
2.日志实现对比,以及springboot的日志实现选择:
Log4j:log for java,是Apache的提供的开源的java日志框架
JUL:java.util.logging,是jdk自带的日志,是因为当时log4j太火了,害怕日志市场被人家占领了,所以勉强的加了一个日志工具
Log4j2:是对Log4j的一次重大升级。其实是借了log4j之名,是apache公司重新做的日志框架,整个日志框架设计的也特别好,但是现在的很多框架还没适配起来,还没有得到广泛的使用
LogBack:比log4j先进,用的地方比较多,
所以springboot最终的日志实现选择:logback
补充:
log4j和logback都是同一个人写的,在对log4j升级的:
当时写出来log4j还不错,后来出现性能问题了,要对log4j进行升级了,就写了logback框架, 为了适应更多的日志实现框架,他就写了日志门面slf4j日志门面,
所以log4j、logback、slf4j都是出自同一个人之手
JCL、slf4j等日志框架都是日志实现的抽象层,编码的时候,面向日志抽象层编码,之后给项目中导入具体的日志实现就行了
二:springboot的默认日志选择
SpringBoot:底层是Spring框架,而Spring框架默认选用的日志框架是用JCL(commons-logging);而 SpringBoot框架默认选用的是SLF4j和logback;
这样能够兼容是因为:springboot已经把spring框架的默认日志依赖移除掉了:
Spring框架选用的是:commons-logging日至门面
Hibernate底层是:jboss-logging日志门面
Springboot底层是:slf4j日志门面
三:slf4j简介
slf4j主要是为了给Java日志访问提供一个标准、规范的API框架,其主要意义在于提供接口,具体的实现可以交由其他日志框架,例如log4j和logback等。对于一般的Java项目而言,日志框架会选择slf4j-api作为门面,配上具体的实现框架(log4j、logback等),中间使用桥接器完成桥接。本文侧重分析slf4j,也会解释门面+桥接器+实现的原理。