日志架构选型:彻底搞懂Log4j、Log4j2、LogBack、Slf4j之间的关系
创始人
2024-11-17 22:11:25
0

  这几天在搭建新的项目服务,正好需要整合日志框架进来,看了一下公司原来项目中有Log4j2、LogBack等好几种日志框架,刚好也有同事问我如何选型,我们从两个方面好好探究一下,首先彻底搞懂Log4j、Log4j2、LogBack,Slf4j他们之间的关系。然后通过代码示例展示如何使用。

一、搞懂Log4j、Log4j2、LogBack,Slf4j的关系

在讲他们之间的关系之前,先认识一个设计模式—门面模式

  在Java中,门面模式(Facade Pattern)也被称为外观模式,是一种为子系统中的一组接口提供一个统一的接口的设计模式。

  门面模式定义了一个高层接口,这个接口使得子系统更加容易使用。该模式隐藏了系统的复杂性,对客户端来说,只需要知道门面接口即可,无需关心子系统内部的具体实现和细节。

门面模式通常涉及以下几个重要角色:

1.门面(Facade):客户端通过它访问子系统。门面知道如何与子系统的各个组件进行交互,并为客户端提供一个统一和简单的接口。

2.子系统(Subsystem):包含多个组件,每个组件都实现了一些特定的功能。子系统对客户端来说是未知的或者难以使用的。

3.客户端(Client):与门面进行交互,通过门面来间接地使用子系统的功能。

  为什么我们先说一下这个门面模式呢,因为现今主流的日志组件都是使用门面模式实现的。而commons-logging(JCL)和Slf4j就是门面模式中的Facade角色。

在这里插入图片描述

SLF4J与commons-logging的区别又是什么

1.SLF4J介绍

SLF4J:是一个用于Java的简单日志门面(Facade)或抽象层,它本身并不实现日志功能,而是依赖于其他实际的日志框架(如Logback、log4j、java.util.logging等)来完成日志记录。SLF4J的主要目标是使得应用程序能够在运行时动态地绑定到任何日志框架,而无需修改任何代码。

  SLF4J提供了一组简单的API,允许开发人员编写不依赖于特定日志框架的代码。然后,通过在类路径中放置适当的SLF4J绑定和日志框架实现,可以在运行时选择实际的日志框架。

2.commons-logging介绍
commons-logging:是Apache Commons项目的一部分,它提供了一个简单的日志抽象层,类似于SLF4J。然而,与SLF4J不同的是,commons-logging试图自动检测并使用类路径中存在的日志框架,而不是依赖于显式绑定。

  commons-logging的设计初衷是为了提供一个统一的日志接口,以便可以在不同的项目中使用不同的日志框架,而无需修改代码。然而,由于其自动检测机制,有时可能会导致不可预测的行为或版本冲突。

说明:
  commons-logging这个日志组件是JDK自带的日志框架。由于在使用便利性和性能上都欠佳,所以现在主流使用的还是SLF4J。

下面我们就来看一下slf4j、log4j、logback和log4j2的区别
1.slf4j:
  slf4j是一个日志接口(或称为门面/抽象层),它本身并不实现日志功能,而是为各种日志框架(如log4j、logback等)提供了一套统一的接口。

  使用slf4j的好处是,开发者可以在代码中只使用slf4j的接口,然后在运行时或部署时根据实际需要选择具体的日志实现框架。这增加了代码的灵活性和可移植性。

  slf4j与具体的日志实现框架(如log4j、logback)之间通过桥接器(binding)进行连接。

2.log4j:
  log4j是Apache的一个早期日志框架,它允许开发者通过配置文件灵活地控制日志的输出目标、记录级别、输出格式等。
随着时间的推移,log4j已经逐渐被其后续版本log4j2所取代。

3.logback:
  logback是log4j的创始人Ceki Gülcü开发的一个新的日志框架,它被视为log4j的继任者。

  logback在性能、内存使用和灵活性方面都优于log4j,并且它直接实现了slf4j的接口,因此可以作为slf4j的一个具体实现。
logback本身包含了一套完整的日志解决方案,无需依赖其他库。

4.log4j2:
  log4j2是log4j的后续版本,它在性能、功能、灵活性和易用性方面都有了很大的提升。

  log4j2支持异步日志记录,可以极大地提高多线程环境下的日志性能。

  log4j2也支持通过配置文件进行灵活的配置,包括日志的输出目标、记录级别、输出格式等。

  log4j2也提供了对slf4j的桥接支持,因此可以作为slf4j的一个具体实现。

总结:
  ①.slf4j是一个日志接口,它定义了日志记录的规范,但不具体实现日志功能。

  ②.log4j是一个早期的日志框架,但已经逐渐被其后续版本log4j2所取代。

  ③.logback是一个新的日志框架,它直接实现了slf4j的接口,并提供了高性能、灵活的日志记录功能。

  ④.log4j2是log4j的后续版本,它在性能、功能和易用性方面都有很大的提升,并支持作为slf4j的一个具体实现。

项目中如何使用,官方提供了相关的实现和依赖关系图

在这里插入图片描述
在这里插入图片描述
上述图总结如下:
1.slf4j + log4j:
需要使用slf4j和log4j来进行日志输出的话,我们需要引入下面的jar包

slf4j-api.jar:slf4j核心jar包

log4j.jar:log4j核心jar包

slf4j-log412.jar:slf4j与log4j的桥接包

2.slf4j + logback:
需要使用slf4j和logback来进行日志输出的话,我们需要引入下面的 jar包

slf4j-api.jar: slf4j核心jar包

logback-core.jar:logback直接实现了 slf4j-api 逻辑,不再需要桥接包

logback-classic.jar(集成包)

3.slf4j + jul:
需要使用slf4j和jul来进行日志输出的话,我们需要引入下面的 jar 包

slf4j-api.jar: slf4j核心jar包

slf4j-jdk14.jar:桥接包

4.也可以只用slf4j无日志实现

slf4j-api.jar + slf4j-nop.jar

官方图中没有log4j2依赖jar的关系

5.slf4j + log4j2:
需要使用 slf4j 和 log4j2 来进行日志输出的话,我们需要引入下面的 jar 包:

log4j2核心jar包:log4j-api.jar 和 log4j-core.jar

slf4j核心jar包:slf4j-api.jar

slf4j与log4j2的桥接包:log4j-slf4j-impl-2.8.2.jar

二、代码实战

项目中应用springboot集成log4j2

SpringBoot默认使用的日志系统为:SLF4j + Logback。
现在需要替换成SLF4j + Log4j2

1.去除SpringBoot中默认的Logback包

     org.springframework.boot     spring-boot-starter-web                           org.springframework.boot             spring-boot-starter-logging                

2.添加需要的依赖

     org.springframework.boot     spring-boot-starter-log4j2  

3.配置文件中增加需要的配置

logging:   config: classpath:log4j2-spring.xml 

4.新增log4j2-spring.xml文件

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            

5.在类中打印日志

private static final Logger LOGGER = LoggerFactory.getLogger(TestServiceImpl.class); 
 LOGGER.info("参数={}", JSONUtil.toJsonStr(resp)) 

  当然也可以使用@Slf4j和@Log4j2注解形式,但是需要引入lombok依赖包。

相关内容

热门资讯

带你了解!wepoker私人局... 带你了解!wepoker私人局俱乐部辅助,微友辅助神器下载,机巧教程(证实有挂)1)微友辅助神器下载...
七分钟辅助!德普之星透视辅助插... 七分钟辅助!德普之星透视辅助插件,微扑克数据分析,详细教程(真的有挂)1、七分钟辅助!德普之星透视辅...
解密妙招!潮友会鱼虾蟹塞子概率... 解密妙招!潮友会鱼虾蟹塞子概率计算方式,顺欣茶楼辅助软件,详细教程(有挂解惑)1、该软件可以轻松地帮...
现场直击!wpk辅助插件,大菠... 现场直击!wpk辅助插件,大菠萝免费辅助,策略教程(有挂技术)现场直击!wpk辅助插件,大菠萝免费辅...
8分钟辅助!悟空黑桃a辅助,w... 8分钟辅助!悟空黑桃a辅助,wepoker破解器激活码,详细教程(有挂实锤)进入游戏-大厅左侧-新手...
专业方案!佛手十三道破解版安卓... 专业方案!佛手十三道破解版安卓,友友联盟辅助免费下载,详细教程(竟然有挂)1、佛手十三道破解版安卓脚...
来一盘!德普之星怎么开辅助,拱... 来一盘!德普之星怎么开辅助,拱趴大菠萝辅助工具是真的吗,技法教程(讲解有挂)1、这是跨平台的拱趴大菠...
三分钟辅助!德扑圈透视挂,we... 三分钟辅助!德扑圈透视挂,wepoker代打辅助,详细教程(有挂方略)1、玩家可以在wepoker代...
一分钟了解!wepoker透视... 一分钟了解!wepoker透视脚本网页,微信闲来辅助神器,手段教程(有挂分析)1、首先打开微信闲来辅...
详情诀窍!微信雀神挂件开挂辅助... 详情诀窍!微信雀神挂件开挂辅助,一起宁德钓蟹辅助器,详细教程(有挂方针)所有人都在同一条线上,像星星...