Apache Log4j 2是Log4j的更新,對其前身Log4j 1.x進行了重大改進,并提供了Logback中可用的許多改進,同時修複了Logback架構中的一些固作者有問題。雖然2021年出現過重大Bug(非得加N種特性,滿足需求就好不要加各種花裡胡哨的,後期可以考慮插件添加特性),也不妨礙它是Java界目前最火最快最好的日志架構。
本次介紹的版本是
2.18.0

1. 名詞介紹
在選擇日志架構的時候大家是不是也和我一樣,被各種名詞所困擾?這裡給大家介紹一下吧:
這裡我們先來了解一下什麼是日志門面架構,它就像一個司令官,接受到你的指令之後他會找具體的士兵進行具體的輸出日志操作。那為啥叫門面呢?找人辦事至少得有門路對不。
名詞 | 作用 | 簡介 |
---|---|---|
JCL | 日志門面架構 | Apache Commons Logging之前叫Jakarta Commons Logging,簡稱JCL,提供了一個 Log 接口,該接口既輕量級又是其他日志記錄工具包的獨立抽象。它為中間件/工具開發人員提供了一個簡單的日志記錄抽象,允許開發人員選擇特定的日志實作。很遺憾的是它于 停止了更新,停在了1.2版本了。 |
SLF4J | 日志門面架構 | The Simple Logging Facade for Java作為各種日志記錄架構(例如.java.util.loglog,logback,log4j)的簡單外觀或抽象,允許最終使用者在部署時選擇所需的日志記錄架構。Ceki Gülcü建立了SLF4J作為Jakarta commons-logging架構的替代品。 |
下面介紹的是日志實作架構,這個就是士兵了,司令官接收到指令之後,就會找具體的士兵去執行了,可以是A士兵也可以是B士兵,看開發人員的心情了。
名詞 | 作用 | 簡介 |
---|---|---|
JUL | 日志實作架構 | JAVA自帶的日志記錄工具,在java.util.logging包下面,是平台核心日志記錄工具的類和接口。日志記錄 API 的中心目标是支援在客戶站點維護和維護軟體。 |
Log4j | 日志實作架構 | Apache Log4j 1.x,可惜的是在 停止了更新。作者:Ceki Gülcü |
Log4j2 | 日志實作架構 | Apache Log4j 2是Log4j的更新,對其前身Log4j 1.x進行了重大改進所有并不相容1.x,并提供了Logback中可用的許多改進,同時修複了Logback架構中的一些固有問題。 |
Logback | 日志實作架構 | Logback旨在作為流行的log4j項目的繼承者。它由log4j的創始人Ceki Gülcü設計。建立在設計工業強度測井系統方面十年的經驗之上。由此産生的産品,即日志備份,比所有現有的日志記錄系統更快,占用空間更小,有時幅度很大。同樣重要的是,logback提供了其他日志記錄系統中缺少的獨特且相當有用的功能。 |
那我們來看看Log4j2官網的性能對比吧:
https://logging.apache.org/log4j/2.x/manual/async.html#Performance
與其他日志記錄包的異步吞吐量比較圖
響應時間延遲對比圖
通過上面的介紹,我們知道司令員隻能選擇SLF4J了,然後士兵我們也是選擇性能最高的Log4j2了。
文末有示範代碼倉。
2. Log4j2文檔介紹
Log4j2官網教程
https://logging.apache.org/log4j/2.x/articles.html
打開官網,就可以看到有中文的教程(
PS:如果有清楚如何在這裡添加文章的大佬可以滴滴我~
):
SpringBoot配置檔案官網配置:
log4j2.xml
https://github.com/spring-projects/spring-boot/blob/v2.7.2/spring-boot-project/spring-boot/src/main/resources/org/springframework/boot/logging/log4j2/log4j2.xml
3. SpringBoot使用Log4j2
我們先來看一下SpringBoot官方推薦的日志實作架構Logback:
是不是很簡單,直接內建在web裡面了。
我們在使用Log4j2之前需要先排除starter-logging,如下所示:
https://docs.spring.io/spring-boot/docs/2.7.2/reference/htmlsingle/#howto.logging.log4j
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
排除之前的包如下:
排除之後:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Logger name="com.jack" level="INFO"/>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>