簡體   English   中英

MDC在日志文件中記錄錯誤的會話ID

[英]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是基於每個線程進行管理”

我做錯什么了嗎?

引用來源:

https://blog.trifork.com/2013/06/06/adding-user-info-to-log-entries-in-a-multi-user-app-using-mapped-diagnostic-context/

MDC基於ThreadLocal的后果

在線程被重用以處理另一個請求之前,您應該刪除放置在該線程中的條目,以免該線程的下一個用戶無意中拾取它們。 通常最好在上例中顯示的finally子句中執行此操作,以便即使在引發異常的情況下也進行清理。

對於子線程,MDC內容自動傳播到其他線程(更新:對於從1.1.5版開始的Logback不再適用),但是當您使用從例如線程池獲得的線程時,則不會。 這意味着您在運行某些異步任務時會丟失MDC信息。

如果您希望MDC內容可以從工作線程中獲得,請確保在運行任務之前將MDC內容傳播到那些線程。 SLF4J的MDC具有用於此特定目的的getCopyOfContextMap()方法。 一種可能的方法是使用專用的Runnable子類:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM