Log4j MDC
問題
在項目中需要分類收集處理日誌信息,使用log4j的MDC線程中添加分類信息。不過最近卻出現信息記錄錯誤的情況,具體來說就是會出現本來屬於下一個分類的一部分信息莫名的記錄到上一個分類的日誌文件中了。
問題原因分析
MDC 需要在完成後被重置,或者說清空。因爲MDC是綁定線程的,所以,在大多數簡單的使用的情況下,例如在服務器端接受請求的入口處,設置一個MDC信息,如果服務器這個程序任務的程序結束後會被丟棄,那麼也不會出現什麼問題,但是如果是一個線程池,池的線程會被重複利用的情況下,如果你沒有結束後清楚MDC的信息,那麼在下次設置之前,上次設置以後的這段日誌,就會出現數據錯亂的情況。
解決方法
在log4j 1.2.16以後的版本,MDC直接提供了clear()
方法即:
MDC.clear()
或者手動清理MDC
MDC.getContext().clear();
// 需要校驗一下MDC.getContext() 不爲null
tip
當我們在項目中使用 ThreadLocal
時,在一個線程結束時也需要清空 ThreadLocal
中的數據,否則也可能會出現上述情況。