MDC在日志文件中记录错误的会话ID

时间:2015-01-26 20:52:24

标签: java log4j mdc

我们正在使用MDC记录具有会话ID的所有事务,但有时它会附加错误的sessiond

我在Filter

中搜索sessionId
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基于每个线程进行管理"

我在做什么事吗?

1 个答案:

答案 0 :(得分:2)

引用来源:

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

  

基于线程本地的MDC的后果

     

在线程被重用于处理另一个请求之前,您应该   删除您放置在此处的条目,以免被疏忽   由线程的下一个用户接听。通常最好这样做   如上例所示,在finally子句中进行清理   即使抛出异常也会发生。

     

自动将MDC内容传播到其他线程   子线程(更新:对于从以下位置开始的Logback不再适用)   1.1.5版),但如果您使用的是从例如一种   线程池。这意味着您在跑步时会丢失MDC信息   一些异步任务。

     

如果您希望MDC内容可以通过工作线程使用,   然后确保将MDC内容传播到这些线程   在运行任务之前。 SLF4J的MDC具有getCopyOfContextMap()   此特定目的的方法。一种可能的方法是   使用专用的Runnable子类: