Log4J2 日誌鏈實現

背景:

日誌是系統出現問題,最關鍵的信息,讓開發人員快速找到日誌信息,定位問題,我們需要有一個完整的日誌系統,業界有ELK等日誌系統,特別在分佈式(微服務)中,日誌就變得更加複雜,服務器資源多,日誌打印開發無法快速找到日誌信息在哪一臺機器上,這時就需要我們記錄日誌的信息鏈路(路由),日誌跟蹤ID(TraceID)等信息,返回跟前端,開發通過查看接口就能快速找到日誌信息方便定位問題。

關鍵技術

Log4j : MDC

Log4j : ThreadContext

MDC介紹

MDC(Mapped Diagnostic Context,映射調試上下文)是 log4j 和 logback 提供的一種方便在多線程條件下記錄日誌的功能。

MDC 可以看成是一個與當前線程綁定的哈希表,可以往其中添加鍵值對。MDC 中包含的內容可以被同一線程中執行的代碼所訪問。當前線程的子線程會繼承其父線程中的 MDC 的內容。當需要記錄日誌時,只需要從 MDC 中獲取所需的信息即可。MDC 的內容則由程序在適當的時候保存進去。對於一個 Web 應用來說,通常是在請求被處理的最開始保存這些數據。

ThreadContext 介紹

線程上下文

Log4j引入了映射診斷上下文或MDC的概念。已經在許多地方記錄並討論了 Log4j MDC和 Log4j以及映射診斷語境。此外,Log4j 1.x還提供對嵌套診斷環境或NDC的支持。它也已經在諸如Log4j NDC等不同地方進行了記錄和討論 。SLF4J / Logback之後,自己實現了MDC,這在Mapped Diagnostic Context中被很好地記錄下來 。

平臺實現方式

1. 實現日誌過濾器LogChainFilter

Log4J2 日誌鏈實現

2.修改Log4J打印日誌信息

Log4J2 日誌鏈實現

3.記錄日誌路由信息

Log4J2 日誌鏈實現

4.清除日誌上下文信息

Log4J2 日誌鏈實現

Spring Mvc 支持日誌鏈實現

日誌實現同上,但是我們需要將TranceID添加到響應頭當中,如果在每個接口方法中添加,會覺得很笨,最好能統一為接口請求添加。所以我們需要用到Spring Mvc的一個Controller的通知,動態加上去

實現方式

編寫一個接口實現ResponseBodyAdvice<object>接口,添加註解@ControllerAdvice,此時該接口併成功注入為Controller層的切面通知,可以獲取Response對象/<object>

Log4J2 日誌鏈實現


分享到:


相關文章: