2017-11-10 12 views
1

저는 Sping Boot 1.5.7을 사용하고 있습니다. 이 응용 프로그램은 Restful API를 제공합니다. 사용자 이름과 트랜잭션 ID로 MDC를 설정하는 필터가 있습니다.로그백 sfl4j http 요청에 고유 한 MDC

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

각 요청에 대해 MDC 맵을 갖고 싶지만 MDC 데이터는 다른 요청 사이에서 공유됩니다.

제발 도와 주실 수 있습니까? 감사.

UPDATE :에 살고 있고 세션 ID와 사용자가 대신 MDC지도에서,

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 | 

초 요청에 난 단지 트랜스-ID를 설정합니다

모든 행 아래 로그에서

는 HTTP 요청입니다 첫 번째 요청.

답변

1

로깅 구현으로 logback을 사용하고 있다고 가정하고, 언제든지 한 스레드가 완료 될 때까지 하나의 요청을 처리하고 있습니다. documentation에 따르면 MDC는 이미 스레드 당 저장되므로 사용 사례로 충분합니다. 우리 프로젝트에서는 MDC를 사용하여 디버깅 목적으로 스레드 ID가 아닌 스레드 ID를 추적하여 예상대로 작동합니다.

MDC는 스레드별로 컨텍스트 정보를 관리합니다. 새로운 클라이언트 요청에 서비스를 시작하는 동안 일반적으로, 개발자는 MDC 여기
+0

자세한 내용은 내 게시물을 업데이트했습니다. 감사. –

+0

이해하십시오. Spring 인터셉터에서 MDC 값을 지울 수 있습니다. 'HandlerInterceptorAdapter # preHandle'를 오버라이드하는 것만으로 충분할 수도 있습니다 – Apolozeus

+0

몇 가지 예를 들어 주시겠습니까? –

1

에 등 관련 상황 정보 등의 클라이언트 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 
{ 

     } 
    }); 
} 
} 
+0

감사합니다. 인터셉터는 필터 전에 시작됩니까? –

+0

정확히 들어오는 각 요청에 대해 MDC가 먼저 지워지고 실제 요청 처리기 – Apolozeus

+0

내가 시도합니다. 감사합니다 –