logback那些事儿

本文介绍了Java日志框架的发展历程,包括logback、JUL、JCL、SLF4J和log4j2。重点讲述了为什么使用日志门面SLF4J,以及logback的结构和异步输出机制。通过异步输出,logback利用BlockingQueue实现生产者消费者模型,提高程序性能。最后讨论了logback与log4j2的选择,尽管log4j2功能更丰富,但logback因其与slf4j的无缝集成和Spring Boot的默认选择,仍广泛使用。
摘要由CSDN通过智能技术生成

Java开发中都是默认使用日志门面+日志实现的方式打印日志。日志门面主要是为了给Java日志访问提供一套标准、规范的API框架,其主要意义在于提供接口,具体的实现可以交由具体的日志实现框架。

1.那些年那些日志框架

日志门面 日志实现
JCL(Jakarta Commons Logging) JUL(java.util.logging)
SLF4j(Simple Logging Facade for Java) log4j、log4j2、logback
  • logback
    在很久以前,Java并没有日志框架,大家打印日志靠的还是print语句输出。后来Apache上出现了一个开源的项目,是由E.U.SEMPER(欧洲安全电子市场)编写的一个API,其主要作者是一位超级大神Ceki Gülcü,这个日志框架很快被广大Java程序员使用起来,成为一代最经典的日志框架。
  • JUL
    很快,作为Java的发明者Sun公司坐不住了,在发布Java1.4版本的时候,推出了自带的系统JUL,很明显是与log4j进行对抗。但是这个时候log4j已经成熟了,而JUL存在很多的不足,比较混乱,一般并不推荐使用。
  • JCL
    这个时候,Apache继续发力,推出了日志的接口,也就是我们现在说的日志门面,这样不论你用log4j还是JUL,都可以去实现JCL这个日志门面,然后随意切换。这样Apache统治了一段时间的日志框架,但是好景不常,人们发现JCL算法非常复杂,一旦出现问题难以排查。
  • SLF4J
    大神Ceki Gülcü,也就是log4j的作者离开了Apache,他自己一个人写出了一个新的日志门面来替代JCL,也就是现在人们常用的SLF4J。它受类加载器的影响较小,不易产生内存溢出的问题,性能得到了改善,而且它比较简洁,很快成为新的宠儿。
  • logback
    还是Ceki Gülcü大神,对log4j进行了升级改造,写出来一个可以直接实现SLF4J的框架logback,它相对log4j性能更好,功能更丰富。
  • log4j2
    这次该Apache坐不住了,扶我起来,我还能战。Apache发布了一个新的项目log4j2,听起来像是log4j的升级版,但实际上我们知道他们不是同一个作者,很明显它是冲着logback来的。log4j2几乎包括了logback所有的功能和内容,而且比它更丰富。

2.为什么使用日志门面

日志框架这么多,明明可以拿来直接用,为何还要使用日志门面呢?我们都知道,编程届有一句话叫做高内聚低耦合。每一种日志框架都有自己的API,如果一个应用程序想要更换日志框架,那就得修改代码,使用其对应的API,这样就增加了应用程序对于日志框架的耦合性。
如果使用了日志门面,就可以在日志框架和应用程序之间架设一个沟通的桥梁,无论使用什么日志框架,使用的都是门面的API,只需要依赖不同的jar包,应用程序不需要修改任何代码。话不多说,直接上图。当然如果你需要自定义日志的输出格式,还是需要修改配置文件的。
在这里插入图片描述
现在大部分应用都使用slf4j作为日志门面,作者创建slf4j的目的是为了替代JCL。slf4j所提供的核心API是一些接口以及一个LoggerFactory的工厂类。在使用slf4j的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统,只需要依赖slf4j和日志实现框架以及中间桥接的jar包。下图是slf4j官方的项目组成图,本质上就是slf4j的jar加上不同日志实现框架的jar包或者中间桥接jar包,实际上就是上图的具体实践。
在这里插入图片描述

3.看看logback里面都有啥

结构

Logback分为三个模块,logback-core、logback-classic和logback-access。core模块为其他两个模块奠定了基础,classic模块扩展了core模块,相当于log4j的一个显著改进版本。logback-classic原生实现了slf4j API,可以和其他日志系统随意地来回切换,诸如log4j、JUL等。access模块与Servlet容器集成以提供HTTP访问日志的功能。
在这里插入图片描述
Logback建立于三个主要类之上:Logger(消息类型和级别来记录消息)、Appender(输出目的)和Layout(输出格式)。这三种组件协同工作,使开发者可以按照消息类型和级别来记录消息,还可以在程序运行期内控制消息的输出格式和输出目的地。
在这里插入图片描述

应用

  • 添加依赖
    使用logback,首先需要添加相应的依赖。spring-boot-starter中包含了 spring-boot-starter-logging,该依赖内容就是默认的日志框架 logback+slf4j,而 spring-boot-starter-web 包含了spring-boot-starter,所以我们只需要引入web组件即可。
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
  • 配置文件
    如果不需要定制化输出日志,可以不用设置配置文件,直接输出到控制台。如果想要按照自己的要求输出日
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值