Java http请求的唯一回写sfl4j MDC

Java http请求的唯一回写sfl4j MDC,java,spring-boot,logging,logback,mdc,Java,Spring Boot,Logging,Logback,Mdc,我正在使用Spring Boot 1.5.7。该应用程序提供了Restful API。 我有一个过滤器,在这里我用用户名和事务id设置MDC MDC.put("user", authentication.getPrincipal().toString()); MDC.put("trans-id",authentication.getTokenId()); 我希望每个请求都有一个MDC映射,而不是在不同的请求之间共享MDC数据 你能帮我吗?谢谢 更新: 在下面的日志中,每一行都是

我正在使用Spring Boot 1.5.7。该应用程序提供了Restful API。 我有一个过滤器,在这里我用用户名和事务id设置MDC

    MDC.put("user", authentication.getPrincipal().toString());
    MDC.put("trans-id",authentication.getTokenId());
我希望每个请求都有一个MDC映射,而不是在不同的请求之间共享MDC数据

你能帮我吗?谢谢

更新:

在下面的日志中,每一行都是一个http请求:

2017-11-10 21:34:52.867 | user=USER, trans-id=c28f4b68-b5f3-4b5c-9bb5-f18ba9d1cd7d, session-id=daaddaadda |   INFO 976 - [tp1005246661-89] i.e.h.controller.IsAliveController       : /isAlive WSC | 

2017-11-10 21:34:59.551 | user=USER, trans-id=4a0eaec1-184a-4587-8fce-ab013ad6539b, session-id=daaddaadda |   INFO 976 - [tp1005246661-89] i.e.h.controller.IsAliveController       : /isAlive public | 

在第二个请求中,我只设置了trans id,而在MDC映射中,第一个请求中设置了会话id和用户

我假设您使用logback作为日志实现,并且在任何时候,一个线程都在处理一个请求直到完成。根据,MDC已经存储在每个线程中,因此对于您的用例来说就足够了。在我们的项目中,我们使用MDC跟踪线程id(而不是线程名称)以进行调试,它按预期工作

MDC基于每个线程管理上下文信息。通常,在开始为新的客户机请求提供服务时,开发人员将向MDC中插入相关的上下文信息,例如客户机id、客户机IP地址、请求参数等
下面是示例配置类

@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 
{

        }
    });
}
}

我已经用更多的信息更新了我的帖子。谢谢,我明白了。您可以在spring拦截器中清除MDC值。重写
HandlerInterceptorAdapter#preHandle
可能就足够了。您有一些示例吗?当然,我只是快速测试一下。它似乎工作得很好。我试试看。现在,在第一次初始化之前,我已经清除了MDC映射。它似乎工作得很好。谢谢,谢谢。拦截器在筛选之前启动?确切地说,对于每个传入的请求,MDC将首先被清除,并将到达实际的请求句柄。我将尝试它。Thanks@Apolozeus也许你应该编辑你的答案(通过点击答案下方的
edit
链接),而不是发布同一个问题的第二个答案?@Apolozeus在我的例子中,我在过滤器中插入了MDC.clear()。过滤器在拦截器之前执行。谢谢