Logback sfl4j MDC对于http请求是唯一的

时间:2017-11-10 18:27:08

标签: java spring-boot logging logback mdc

我正在使用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和用户在第一个请求中设置。

2 个答案:

答案 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 
{

        }
    });
}
}