Spring MVC HandlerInterceptorAdapter 缺少 slf4j Logback 跟踪 ID

Spring MVC HandlerInterceptorAdapter Missing slf4j Logback Trace ID

我有 Spring MVC 应用程序,我在其中实现了一个 class,它扩展了 HandlerInterceptorAdapter 以便我在执行任何控制器之前在 preHandle、postHandle 和 afterCompletion 中执行一些操作。以下是我观察到的。

preHandle 日志记录的日志条目 应用时间:00:30:01.230 |线程:[http-nio-8080-exec-1] |级别:信息 | Class: hello.extractor | X-Span-Export=false,X-B3-SpanId=3aad3f52e26eb59d,X-B3-TraceId=3aad3f52e26eb59d |消息:内部 preHandle

postHandle 日志记录的日志条目 应用时间:00:30:01.394 |线程:[http-nio-8080-exec-1] |级别:信息 | Class: hello.extractor | X-Span-Export=false,X-B3-SpanId=3aad3f52e26eb59d,X-B3-TraceId=3aad3f52e26eb59d |消息:内部 postHandle

完成后记录的日志条目 AppTime:00:30:01.395 |线程:[http-nio-8080-exec-1] |级别:信息 | Class: hello.extractor | | Msg: Inside afterCompletion.

如果您看到第三个条目缺少跟踪 ID 和跨度 ID。知道如何解决这个问题吗?

public class Extractor extends HandlerInterceptorAdapter {

private static Logger logger = LoggerFactory.getLogger(HttpHeaderExtractor.class);

@Autowired
public Extractor() {
}

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
        throws Exception {

    logger.info("Inside preHandle");
    return true;
}

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
        ModelAndView modelAndView) throws Exception {
    logger.info("Inside postHandle");
}

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
        throws Exception {
    logger.info("Inside afterCompletion");
}

}

我发现我们已经添加了另一个 HandlerIntercepter,它正在执行 MDC 日志记录,并且在其中我们手动清除导致在我的另一个 HandlerIntercepter aftercompletion 方法中不填充跟踪 ID。此外,如果您使用多个处理程序拦截器并且您注册的顺序很重要。在最新的 spring 中,您将以相反的顺序声明它们,以便它们一个一个地执行。