Spring Boot(六):一招學會Log4j2
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包,具體如下:
<!—— 去掉預設配置 ——>
<!—— 引入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檔案中的
多環境配置日誌檔案
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”?>
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的列印
從打印出的日誌可以看出,這是兩次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到上線完整流程,獲得萬能過關大廠簡歷,提高求職簡歷含金量:
若您覺得還可以,請幫忙點個“贊”,謝謝,您的支援是我最大的動力
上一篇:東師學科英語經驗貼
下一篇:2022美賽何時出成績?