'중첩 된 진단 컨텍스트'(NDC)는 언제 사용합니까?
log4net을 가지고 놀면서 NDC라는 컨텍스트 레이블의 스레드 별 스택을 사용할 가능성을 보았습니다.
이 스택에 푸시 된 레이블은 %x
또는 %ndc
형식 매개 변수를 지정하여 PatternLayout에 표시됩니다 .
사용법은 다음과 같습니다.
ILog log = log4net.LogManager.GetLogger(...) ;
//pattern layout format: "[%ndc] - %message%newline"
log.Info("message 1");
using(log4net.NDC.Push("context")
{
using(log4net.NDC.Push("inner_context")
{
log.Info("message 2");
}
log.Info("message 3");
}
log.Info("message 4");
출력은 다음과 같습니다.
null - message 1
context inner_context - message 2
context - message 3
null - message 4
log4net 프로그래밍 경험에서 언제이 기능이 유용하다고 생각 했습니까?
ASP.NET과 같은 서버 응용 프로그램에서.
예를 들어 현재 요청에 대한 정보를 NDC로 푸시 할 수 있습니다.
예를 원하십니까?
ASP.NET MVC4를 사용하여 작성된 다음 웹 API를 사용하십시오.
// GET api/HypervResource
public string Get()
{
logger.Debug("Start of service test");
System.Threading.Thread.Sleep(5000); // simulate work
logger.Debug("End of service test");
return "HypervResource controller running, use POST to send JSON encoded RPCs";
}
서버 동시 HTTP 요청이 작성되면 로깅이 인터리브 될 수 있습니다. 예
2013-06-27 13:28:11,967 [10] DEBUG HypervResource.WmiCalls [(null)] - Start of service test
2013-06-27 13:28:12,976 [12] DEBUG HypervResource.WmiCalls [(null)] - Start of service test
2013-06-27 13:28:14,116 [13] DEBUG HypervResource.WmiCalls [(null)] - Start of service test
2013-06-27 13:28:16,971 [10] DEBUG HypervResource.WmiCalls [(null)] - End of service test
2013-06-27 13:28:17,979 [12] DEBUG HypervResource.WmiCalls [(null)] - End of service test
2013-06-27 13:28:19,119 [13] DEBUG HypervResource.WmiCalls [(null)] - End of service test
이 간단한 예에서는 스레드 ID를 사용하여 요청을 구분할 수 있지만 로그 파일이 복잡 해짐에 따라 까다로울 수 있습니다.
더 나은 대안은 동일한 요청에 대한 로그 메시지를 함께 그룹화하는 고유 식별자를 제공하는 것입니다. 다음과 같이 코드를 업데이트 할 수 있습니다.
// GET api/HypervResource
public string Get()
{
using(log4net.NDC.Push(Guid.NewGuid().ToString()))
{
logger.Debug("Start of service test");
System.Threading.Thread.Sleep(5000); // simulate work
logger.Debug("End of service test");
return "HypervResource controller running, use POST to send JSON encoded RPCs";
}
}
그러면 특정 요청과 관련된 문제를보기 위해 grep 할 수있는 로그가 생성됩니다. 예
2013-06-27 14:04:31,431 [11] DEBUG HypervResource.WmiCalls [525943cb-226a-43c2-8bd5-03c258d58a79] - Start of service test
2013-06-27 14:04:32,322 [12] DEBUG HypervResource.WmiCalls [5a8941ee-6e26-4c1d-a1dc-b4d9b776630d] - Start of service test
2013-06-27 14:04:34,450 [13] DEBUG HypervResource.WmiCalls [ff2246f1-04bc-4451-9e40-6aa1efb94073] - Start of service test
2013-06-27 14:04:36,434 [11] DEBUG HypervResource.WmiCalls [525943cb-226a-43c2-8bd5-03c258d58a79] - End of service test
2013-06-27 14:04:37,325 [12] DEBUG HypervResource.WmiCalls [5a8941ee-6e26-4c1d-a1dc-b4d9b776630d] - End of service test
2013-06-27 14:04:39,453 [13] DEBUG HypervResource.WmiCalls [ff2246f1-04bc-4451-9e40-6aa1efb94073] - End of service test
이러한 기능은 처리 할 로그가 많을 때 유용합니다. 언제 많은 로그가 있습니까? 인터리빙 출력으로 프로덕션 시스템에서 이상한 버그를 진단합니다. 더 많은 컨텍스트가 있으면 출력을 필터링하거나 불필요한 로그를 출력하지 않을 수 있습니다.
중첩 컨텍스트가 유용 할 수있는 또 다른 경우는 메서드 또는 일부 기능이 다른 컨텍스트에서 여러 번 호출되고 이들을 구별하는 방법이 필요한 경우입니다.
NDC.Push
has been deprecated. The preferred way now (ThreadContext.Stacks["NDC"]
) is this:
var disposable = ThreadContext.Stacks["NDC"].Push("context");
try
{
Log.Info("begin"); // optional, but nice
...
}
finally
{
Log.Info("end"); // optional, but nice
disposable.Dispose();
}
Remember to check your conversion pattern so that it includes %property{NDC}
:
<layout type="log4net.Layout.PatternLayout">
<conversionPattern
value="%date [%2thread] %-5level [%property{NDC}] - %.10240message%newline" />
</layout>
참고URL : https://stackoverflow.com/questions/334367/when-to-use-nested-diagnostic-context-ndc
'UFO ET IT' 카테고리의 다른 글
typescript에서 문자열 보간을 만드는 방법은 무엇입니까? (0) | 2020.12.11 |
---|---|
함수에 전달 된 변수 이름 찾기 (0) | 2020.12.11 |
iPhone 프로그래밍에서 HTTP 서버에 파일 업로드 (0) | 2020.12.11 |
jQuery UI없이 드래그 가능한 div (0) | 2020.12.10 |
iOS에서 프로그래밍 방식으로 종횡비 제한을 어떻게 설정할 수 있습니까? (0) | 2020.12.10 |