您當前的位置:首頁 > 繪畫

Spring Boot(六):一招學會Log4j2

作者:由 圖南 發表于 繪畫時間:2021-08-14

Log4j2簡介

日誌框架slf4j、j.u.l、log4j、logback、log4j2的比較

log4j2配置檔案詳解

,請參考上篇文章《Log4j2使用詳解》

Log4j2例項

下面我們透過例項來看看Log4j2在Spring Boot中的應用

1、引入log4j2依賴

Spring Boot預設使用LogBack,如果我們要使用Log4j2,需要從spring-boot-starter-web中去掉spring-boot-starter-logging依賴,同時顯式宣告使用Log4j2的依賴jar包,具體如下:

org。springframework。boot

spring-boot-starter-web

<!—— 去掉預設配置 ——>

org。springframework。boot

spring-boot-starter-logging

<!—— 引入log4j2依賴 ——>

org。springframework。boot

spring-boot-starter-log4j2

2、建立並配置log4j2-spring.xml

在src/main/resources資料夾下建立log4j2-spring。xml檔案,並寫入如下內容:

<?xml version=“1。0” encoding=“UTF-8”?>

~/

各節點的詳細說明,詳見《Log4j2使用詳解》

logBase請根據專案的實際日誌目錄修改

3、列印日誌

一般情況下,我們使用LoggerFactory去獲取Logger物件,在BlogController中我們加入如下內容:

private final static Logger logger = LoggerFactory。getLogger(BlogController。class);

@GetMapping(value = “log”)

public String printLog() {

logger。trace(“trace log”);

logger。debug(“debug log”);

logger。info(“info log”);

logger。warn(“warn log”);

logger。error(“error log”);

return “print log ok”;

}

呼叫介面,可以看到控制檯和日誌目錄下的logs/access。log檔案中從trace log到error log都依次打印出來,而error。log中打印出了error log。

如果把log4j2-spring。xml檔案中的修改為,則日誌從info級別開始列印,trace和debug日誌不會列印。

多環境配置日誌檔案

Spring Boot預設載入log4j2-spring。xml檔案,如果我們想像application。yml配置檔案一樣,不同的環境配置不同的log4j2檔案,比如本地環境需要在控制檯打印出來,測試環境和線上的日誌目錄不同等,這時候我們也可以根據環境的不同配置不同的日誌檔案。

1、建立log4j2-dev.xml、log4j2-test.xml和log4j2-prod.xml

log4j2-dev.xml:

把log4j2-spring。xml檔案內容copy到log4j2-dev。xml中

log4j2-test.xml:

去掉控制檯列印、修改logBase變數、修改root的日誌level

<?xml version=“1。0” encoding=“UTF-8”?>

~/test/

log4j2-prod.xml:

修改logBase變數為~/prod/,其他同log4j2-test。xml

2、刪除log4j2-spring.xml

3、多環境配置日誌檔案

application-dev。yml增加配置節點:

logging:

config: classpath:log4j2-dev。xml

application-test。yml增加配置節點:

logging:

config: classpath:log4j2-test。xml

application-prod。yml增加配置節點:

logging:

config: classpath:log4j2-prod。xml

4、修改環境變數,檢視日誌列印結果

IDEA中透過修改Active profiles來切換dev、test和prod環境,可以看到不同的環境打印出的日誌

使用traceId跟蹤請求全流程日誌

線上我們一般採用多機部署,用kibana收集日誌,但是在併發大的時候,使用日誌定位問題比較麻煩,很難篩選出指定請求的全部相關日誌。因此我們可以對日誌列印做一個改造,使用traceId跟蹤請求的全部路徑。

1、MDC簡介

MDC:Mapped Diagnostic Context,對映除錯上下文,它是 log4j 和 logback 提供的一種方便在多執行緒條件下記錄日誌的功能。MDC 中包含的內容可以被同一執行緒中執行的程式碼所訪問。當前執行緒的子執行緒會繼承其父執行緒中的 MDC 的內容。當需要記錄日誌時,只需要從 MDC 中獲取所需的資訊即可。

2、建立AccessInterceptor

在com。tn666。demo目錄下建立interceptor資料夾,在此資料夾下建立AccessInterceptor類檔案:

public class AccessInterceptor implements HandlerInterceptor {

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {

String traceId = UUID。randomUUID()。toString();

MDC。put(“traceId”, traceId);

return true;

}

}

preHandle方法會在Controller處理之前進行呼叫,我們在請求開始時,向MDC中寫入了一個traceId,這裡主要說一下traceId的記錄,更多攔截器的內容,後續的文章中會詳細介紹

3、建立MvcConfiguration

在com。tn666。demo。configuration資料夾下建立MvcConfiguration類檔案:

@Configuration

public class MvcConfiguration implements WebMvcConfigurer {

@Override

public void addInterceptors(InterceptorRegistry registry) {

registry。addInterceptor(new AccessInterceptor());

}

}

4、讀取traceId

在 log4j 和 logback 的取值方式為:

%X{traceId}

在日誌檔案的PatternLayout中加入traceId的讀取:

5、日誌列印

訪問介面,可以看到traceId的列印

Spring Boot(六):一招學會Log4j2

從打印出的日誌可以看出,這是兩次http請求,有兩個traceId

6、下游服務使用相同traceId

查詢問題時,有時候我們希望把一次請求串起來,包括呼叫第三方服務,這時候我們可以採用如下方法:

1)改造http呼叫工具

在傳送http請求時,自動將traceId新增到header中

2)下游服務的攔截器修改

下游服務的攔截器,首先從header中獲取traceId,寫入MDC中,若header中沒有traceId,再使用UUID

文章中的示例程式碼,可以在

https://

github。com/tunan66666/s

pring-boot-demo

上檢視

這篇文章講了一下Java開發中日誌的記錄,下面的這門課程,是非常適合小白的0基礎課程,包括了直播、編碼實現和輔導答疑,是技術人必備的java表白神器。學習贈送大廠面試禮包,掌握真正釋出上線專案,掌握從0到上線完整流程,獲得萬能過關大廠簡歷,提高求職簡歷含金量:

若您覺得還可以,請幫忙點個“贊”,謝謝,您的支援是我最大的動力

標簽: 日誌  Log4j2  traceId  log  XML