我正在使用Sping Boot 1.5.7。该应用程序提供API Restful。 我有一个过滤器,我使用用户名和事务ID设置MDC。
draw()
我想为每个请求创建一个MDC映射,而不是在不同的请求之间共享MDC数据。
你能帮帮我吗?感谢。更新:
在下面的日志中,每一行都是一个http请求:
MDC.put("user", authentication.getPrincipal().toString());
MDC.put("trans-id",authentication.getTokenId());
在第二个请求中我只设置了trans-id,而在MDC map中有session-id和用户在第一个请求中设置。
答案 0 :(得分:1)
我假设你使用logback作为日志记录实现,并且在任何时候,一个线程正在处理一个请求直到完成。根据{{3}},MDC已经存储在每个线程中,因此对于您的用例就足够了。在我们的项目中,我们使用MDC来跟踪线程id(而不是线程名称)以进行调试,它按预期工作
MDC基于每个线程管理上下文信息。通常,在开始服务新的客户端请求时,开发人员会将相关的上下文信息(例如客户端ID,客户端的IP地址,请求参数等)插入MDC。
答案 1 :(得分:1)
以下是示例配置类
@Configuration
public class SpringConfig extends WebMvcConfigurerAdapter {
private static final Logger LOG = LoggerFactory.getLogger(SpringConfig.class);
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new HandlerInterceptor() {
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
LOG.info("Inside pre-handle");
MDC.clear();
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception
{
}
});
}
}