0

コントローラーが実行される前に、preHandle、postHandle、および afterCompletion 内でいくつかの操作を実行するために、HandlerInterceptorAdapter を拡張するクラスを実装した Spring MVC アプリケーションがあります。以下は私が観察しているものです。

PreHandle ロギング AppTime のログ エントリ: 00:30:01.230 | スレッド: [http-nio-8080-exec-1] | レベル: 情報 | クラス: hello.extractor | X-Span-Export=false、X-B3-SpanId=3aad3f52e26eb59d、X-B3-TraceId=3aad3f52e26eb59d | メッセージ: preHandle の内部

postHandle ロギング AppTime のログ エントリ: 00:30:01.394 | スレッド: [http-nio-8080-exec-1] | レベル: 情報 | クラス: hello.extractor | X-Span-Export=false、X-B3-SpanId=3aad3f52e26eb59d、X-B3-TraceId=3aad3f52e26eb59d | メッセージ: postHandle の内部

afterCompletionlogging AppTime のログ エントリ: 00:30:01.395 | スレッド: [http-nio-8080-exec-1] | レベル: 情報 | クラス: hello.extractor | | | Msg: afterCompletion の内部。

3 番目のエントリにトレース 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");
}

}

4

1 に答える 1

0

MDC ログを実行している別の HandlerIntercepter を追加したことがわかりました。その内部で手動でクリアしていたため、別の HandlerIntercepter aftercompletion メソッドにトレース ID が入力されませんでした。また、複数のハンドラー インターセプターを使用していて、登録するシーケンスが問題になる場合もあります。最近の春には、それらを1つずつ実行するために逆の順序で宣言する必要があります。

于 2016-12-10T07:04:19.720 に答える