[英]MDC logging wrong session ID in log files
我們正在使用MDC記錄具有會話ID的所有事務,但有時會附加錯誤的會話
我在過濾器中sessionsessionId
MDC.put("sessionId", request.getSession().getId());
日志輸出
2015-01-24 23:13:04,857 INFO [STDOUT] (http-0.0.0.0-8090-28) [LOGBACK] 23:13:04.857 [INFO ] 371691C0B3B4481E9589BDE0C24F54C8 [Inbound Message][ID:319526][Address:http://195.233.91.82:8090/myacct/activate/updateConsent][Http-Method:POST][Content-Type:application/json; charset=UTF-8][Headers:{cookie=[JSESSIONID=371691C0B3B4481E9589BDE0C24F54C8;.....
2015-01-24 23:13:05,242 INFO [STDOUT] (http-0.0.0.0-8090-28) [LOGBACK] 23:13:05.242 [INFO ] 1434BC692D5059660EA0F8B36B143064 [Outbound Message][ID:319526][Response-Code:200][Content-Type:application/json;charset=utf-8].......
如您所見,何時恢復的請求的sessionId正確,何時記錄響應,錯誤的sessionId被附加,但是兩個日志的線程相同。
按照MDC“ MDC是基於每個線程進行管理”
我做錯什么了嗎?
引用來源:
MDC基於ThreadLocal的后果
在線程被重用以處理另一個請求之前,您應該刪除放置在該線程中的條目,以免該線程的下一個用戶無意中拾取它們。 通常最好在上例中顯示的finally子句中執行此操作,以便即使在引發異常的情況下也進行清理。
對於子線程,MDC內容自動傳播到其他線程(更新:對於從1.1.5版開始的Logback不再適用),但是當您使用從例如線程池獲得的線程時,則不會。 這意味着您在運行某些異步任務時會丟失MDC信息。
如果您希望MDC內容可以從工作線程中獲得,請確保在運行任務之前將MDC內容傳播到那些線程。 SLF4J的MDC具有用於此特定目的的getCopyOfContextMap()方法。 一種可能的方法是使用專用的Runnable子類:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.