Java http请求的唯一回写sfl4j MDC
我正在使用Spring Boot 1.5.7。该应用程序提供了Restful API。 我有一个过滤器,在这里我用用户名和事务id设置MDCJava 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数据 你能帮我吗?谢谢 更新: 在下面的日志中,每一行都是
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()。过滤器在拦截器之前执行。谢谢