springboot 日志框架

 

一:市面上的日志框架:

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,也会解释门面+桥接器+实现的原理。

 
slf4j+logback的正确的用法:
给系统中导入slf4j、logback的jar,应用程序面向slf4j编程,调用它的抽象层方法,进行日志记录;而我们在系统中也导入了日志的实现logback的jar包,虽然我们调用的是抽象层的方法,但是logback最终会进行实现,将日志记录到文件或者控制台。
每一个日志的实现都有自己的配置文件,使用slf4j以后,配置文件还是要做成日志实现框架的配置文件。
slf4j只提供统一的抽象层,用logback实现就写logback的配置文件,用log4j实现的就写log4j的配置文件,因为毕竟实现类是logback、log4j他们,要怎么输出日志,需要根据他们实现框架的配置文件来走。

 

slf4j+log4j进行日志记录,需要导入的jar:
给系统中导入slf4j、slf4j-log12.jar、log4j的jar(导入slf4j的jar、slf4j来适配log4j的jar、log4j真正实现的jar)
log4j出现的比较早,应用程序还是统一调用抽象层,我们需要中间的一个适配层,适配层就相当于上面实现了slf4j的具体方法,在方法里面进行真正日志记录的时候,调用log4j的api方法
 
 
日志框架转换:其他日志框架可以转为slf4j,参看slf4j官网:https://www.slf4j.org/manual.html
如何让系统中所有的日志都统一到slf4j: 
1、将系统中其他日志框架先排除出去;
2、用中间包来替换原有的日志框架;
3、我们导入slf4j其他的实现
 
 
 
 
 
 
posted @ 2018-11-29 10:31  裸奔的太阳  阅读(2008)  评论(0编辑  收藏  举报