2017-02-10 14 views
2

내 응용 프로그램에서 MDC 로깅 필드를 사용하기 때문에 모든 관련 로그 행을 훨씬 쉽게 찾을 수 있습니다. 또한 응용 프로그램의 시작점이 어디인지 알고 있기 때문에 처리 시작 부분에서 MDC 컨텍스트를 훨씬 쉽게 지울 수 있습니다(). 자신이나 다른 개발자가 MDC.clear()를 호출하는 것을 잊어 버린 많은 예외 경로가 있습니다.).끝에 대신 MDC.clear()를 호출하는 데는 단점이 있습니까?

내 질문은 내가하는 방식에 어떤 단점이 있습니까? 처리 시작과 종료 시점에서 항상 경험적으로 문맥을 지우는 것.

MDC.put(); 
try { 
... 
} finally { 
    MDC.clear(); 
} 

하지만 가끔은 내가 어떤 MDC 관련 코드가없는 라이브러리에서 기본 클래스 또는 무언가를 사용해야합니다 : 나는 내가 좋아하는 일을 할 것 처음부터 코드를 작성하는 경우

는 명확하게하려면 그래서 MDC 코드 줄을 추가하기 위해 라이브러리에서 기본 클래스를 복사하고 싶지 않기 때문에이 방법으로 설명합니다.

답변

1

권장 사항에주의하십시오. 응용 프로그램의 시작 부분을 참조하는 경우 의미가 없으며 그 당시에는 MDC에는 아무 것도 없습니다. 귀하의 참조가 요청 시작 부분에있는 것 같지만,이 경우 다른 요청이 병렬로 처리되고 MDC을 지우면 다른 모든 요청의 로깅에 영향을 미칠 수 있습니다. 각 요청이 끝날 때 MDC.remove()을 호출 할 수 있습니다. 귀하의 정확한 신청서를 모른 채, 이것이 제가 제안 할 수있는 전부입니다.

+0

좀 더 자세한 내용을 보려면 중간계 응용 프로그램에서 작업하여 컴퓨터에서 요청 처리를 처리하십시오. 그래서 제 경우에는 컨텍스트의 모든 값은 해당 요청의 수명 동안 만 의미가 있으므로 다음 요청을 처리하기 시작할 때 MDC.clear()를 호출합니다. – crabe

+0

응용 프로그램이 스레드 공유 모델로 작성된 경우 MDC가 도움이됩니다. 단일 이벤트 루프가 모든 요청을 처리하는 Netty와 같은 것을 사용하면 도움이됩니다. 대부분의 다른 웹 응용 프로그램에서 스레드 번호 만 인쇄하면 요청을 식별 할만큼 충분하다는 것을 알았습니다. –