繁体   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