2017-11-10 3 views
1

私はSping Boot 1.5.7で作業しています。アプリケーションはAPI Restfulを提供します。 ユーザー名とトランザクションIDでMDCを設定するフィルタがあります。ログバックsfl4j httpリクエストでユニークなMDC

MDC.put("user", authentication.getPrincipal().toString()); 
    MDC.put("trans-id",authentication.getTokenId()); 

MDCマップを各リクエストごとに作成したいのではなく、MDCデータを別のリクエストで共有します。

お願いします。ありがとう。

UPDATE:すべての行以下ログで

がHTTPリクエストである:私はトランス-IDを設定する第2の要求で

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 | 

、代わりMDCマップ内にsettedセッションIDとユーザが存在します最初のリクエスト。

答えて

1

私はあなたがロギングの実装としてログバックを使用していると仮定し、いつでも1つのスレッドが完了まで1つの要求を処理しています。 documentationによると、MDCはスレッドごとに既に格納されているため、ユースケースで十分です。私たちのプロジェクトでは、MDCを使用して、デバッグ目的のスレッドID(スレッド名ではない)を追跡し、期待通りに機能します。

MDCはスレッドごとにコンテキスト情報を管理します。一般的に、新しいクライアントの要求に対するサービスを提供し始めている間、開発者は、そのようなクライアントIDとして、クライアントのIPアドレスを適切なコンテキスト情報を挿入します、リクエストパラメータなどMDC へ
+0

私はより多くの情報で自分の投稿を更新しました。ありがとう。 –

+0

を理解してください。スプリングインターセプターでMDC値をクリアすることができます。 'HandlerInterceptorAdapter#preHandle'をオーバーライドするだけで十分かもしれません – Apolozeus

+0

いくつかの例がありますか? –

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 
{ 

     } 
    }); 
} 
} 
です
+0

ありがとうございます。フィルタの前にインターセプタが起動しますか? –

+0

正確に、着信要求ごとに、MDCが最初にクリアされ、実際の要求ハンドラ – Apolozeus

+0

私はそれを試します。ありがとうございます –