2014-01-15 5 views
0

logback.xml 파일 하나만 사용하는 동안 각 응용 프로그램마다 별도의 로그 파일을 만들고 싶습니다. 따라서 SiftingAppender을 사용하고 있습니다.요청에 MDC 값이 전달되지 않음

모든 응용 프로그램에는 특정 MDC을 할당하는 자체 WebApplicationInitializer이 있습니다.

톰캣 서버를 시작할 때 모든 로그 파일은 필요한대로 분할됩니다.

그러나 서버에 요청을 보내면 로깅 출력이 알 수 없음 파일에 기록됩니다. 분명히 MDC 값을 읽을 수 없습니다.

MDC 값은 상위 스레드에서 하위 스레드로 복사됩니다. MDC 값을 할당 할 수 있도록 각 요청의 스레드는 어디에 생성됩니까? 톰캣 같은 고전 서블릿 컨테이너는 스레드 당 요청 모델을 사용하지만

답변

2

, 당신은 은 하나의 웹 응용 프로그램에 단일 스레드의 매핑에 의존 할 수 없다. 이는 요청이 컨테이너 관리 컨테이너 관리 스레드 풀에서 처리되기 때문입니다. 첫 번째로 요청을 처리

request 1 on W1 serviced by A 
request 2 on W2 serviced by B 
request 3 on W1 serviced by C 
request 4 on W2 serviced by A 
... 

당신이 스레드, 볼 수 있듯이 : 3 개 스레드를 라운드 로빈 방식으로 두 개의 웹 어플리케이션의 W1 및 W2 사이에 다른 A, B와 C 이러한 서비스 요청으로 스레드 풀을 상상 webapp W1을 사용하고 나중에 webapp W2에 대한 요청으로 다시 사용되었습니다. 따라서 한 번 스레드에 웹 응용 프로그램 ID를 할당하고 웹 응용 프로그램 ID를 사용하여 완료 할 수 없습니다. 대신, 모든 단일 요청에, 당신은 요청

  • 처리가 완료된 후 요청 스레드에서 웹 응용 프로그램의 ID를 제거를 처리하기 전에 스레드 MDC에서

    • 세트 웹 응용 프로그램 ID에이

    이러한 작업은 모두 예를 들어 Servlet Filter으로 수행 할 수 있습니다. logback documentation"MDC 및 관리되는 스레드" 섹션에서도이 내용을 설명합니다. sample filter implementation도 있습니다. 필요에 맞게 수정할 수 있습니다.

  • +0

    https://stackoverflow.com/questions/6073019/how-to-use-mdc-with-thread-pools –

    +1

    거기에 주어진 답은 프로그램이 스레드 생성 (또는 생성 스레드 풀의). 일반적으로 웹 응용 프로그램에는 해당되지 않습니다. – Pyranja

    +0

    들어오는 필터에서 MDC 속성을 설정하고 나가는 필터에서 필터를 지우고 서블릿 컨테이너 (Tomcat)에서 ** 단일 ** 웹 응용 프로그램을 실행하고 있습니다. 각 스레드가 주어진 시간에 단일 요청 만 처리한다고 가정하는 것이 안전합니까? – Shakkalakka

    관련 문제