一種解決的辦法是採用自定義的日誌格式,把使用者的資訊採用某種方式編碼在日誌記錄中。這種方式的問題在於要求在每個使用日誌記錄器的類中,都可以訪問到使用者相關的資訊。這樣才可能在記錄日誌時使用。這樣的條件通常是比較難以滿足的。mdc 的作用是解決這個問題。
mdc 可以看成是乙個與當前執行緒繫結的雜湊表,可以往其中新增鍵值對。mdc 中包含的內容可以被同一執行緒中執行的**所訪問。當前執行緒的子執行緒會繼承其父執行緒中的 mdc 的內容。當需要記錄日誌時,只需要從 mdc 中獲取所需的資訊即可。mdc 的內容則由程式在適當的時候儲存進去。對於乙個 web 應用來說,通常是在請求被處理的最開始儲存這些資料。
相對比較大的專案來說,一般會有多個開發人員,如果每個開發人員憑自己的理解列印日誌,那麼當使用者反饋問題時,很難通過日誌去快速的定位到出錯原因,也會消耗更多的時間。所以針對這種問題,一般會定義好整個專案的日誌格式,如果是需要追蹤的日誌,開發人員呼叫統一的列印方法,在日誌配置檔案裡面定義好相應的字段,通過mdc功能就能很好的解決問題。
比如我們可以事先把使用者的sessionid,登入使用者的使用者名稱,訪問的城市id,當前訪問商戶id等資訊定義成欄位,執行緒開始時把值放入mdc裡面,後續在其他地方就能直接使用,無需再去設定了。
使用mdc來記錄日誌,一來可以規範多開發下日誌格式的一致性,二來可以為後續使用elk對日誌進行分析。
所需依賴
log4j
log4j
1.2.17
org.slf4j
slf4j-log4j12
1.7.21
log4j.xml配置樣例,追蹤日誌自定義格式主要在name="trance"的layout裡面進行設定,我們使用%x來定義此處會列印mdc裡面key為username的value,如果所定義的字段在mdc不存在對應的key,那麼將不會列印,會留乙個佔位符。
<?xml version="1.0" encoding="utf-8"?>
日誌列印類
import org.slf4j.logger;
import org.slf4j.logge***ctory;
public class tracelogger
public static void info(string message)
public static void info(string format,object... arguments)
}
最後寫個日誌列印測試一下效果
@test
public void test()
執行完後我們可以在定義的日誌輸出路徑下看到以下輸出
[2016-10-19 19:20:26.564] - - - 北京 - f9e287fad9e84cff8b2c2f2ed92adbe6 - 1 - userwyh - - 測試mdc列印一
[2016-10-19 19:20:26.565] - - - 北京 - f9e287fad9e84cff8b2c2f2ed92adbe6 - 1 - userwyh - 110 - 測試mdc列印二
[2016-10-19 19:20:26.565] - 12 - 商戶名稱 - 北京 - f9e287fad9e84cff8b2c2f2ed92adbe6 - 1 - userwyh - 110 - 測試mdc列印三
log4j MDC使用者操作日誌追蹤配置
一種解決的辦法是採用自定義的日誌格式,把使用者的資訊採用某種方式編碼在日誌記錄中。這種方式的問題在於要求在每個使用日誌記錄器的類中,都可以訪問到使用者相關的資訊。這樣才可能在記錄日誌時使用。這樣的條件通常是比較難以滿足的。mdc 的作用是解決這個問題。mdc 可以看成是乙個與當前執行緒繫結的雜湊表,...
log4j用來儲存使用者操作日誌
1.log4j.properties配置檔案中的資訊 log4j.rootlogger debug,db,console log4j.logger.business info,db 2.資料庫表結構 3.controller中 1.查詢出project表中的資料 以上三步就可以直接儲存操作日誌,當然...
Log4 日誌級別
日誌記錄器 logger 是日誌處理的核心元件。log4j具有5種正常級別 level 1.static level debug debug level指出細粒度資訊事件對除錯應用程式是非常有幫助的。2.static level info info level表明 訊息在粗粒度級別上突出強調應用程式...