我们正在使用MDC记录具有会话ID的所有事务,但有时它会附加错误的sessiond
我在Filter
中搜索sessionIdMDC.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基于每个线程进行管理"
我在做什么事吗?
答案 0 :(得分:2)
引用来源:
基于线程本地的MDC的后果
在线程被重用于处理另一个请求之前,您应该 删除您放置在此处的条目,以免被疏忽 由线程的下一个用户接听。通常最好这样做 如上例所示,在finally子句中进行清理 即使抛出异常也会发生。
自动将MDC内容传播到其他线程 子线程(更新:对于从以下位置开始的Logback不再适用) 1.1.5版),但如果您使用的是从例如一种 线程池。这意味着您在跑步时会丢失MDC信息 一些异步任务。
如果您希望MDC内容可以通过工作线程使用, 然后确保将MDC内容传播到这些线程 在运行任务之前。 SLF4J的MDC具有getCopyOfContextMap() 此特定目的的方法。一种可能的方法是 使用专用的Runnable子类: