2012-05-20 7 views
1

nlog 레이아웃을 변경하여 두 항목 사이의 시간을 표시하고 싶습니다. 그러한 레이아웃이 가능합니까?nlog의 시간차

이것은 지금 내 출력물이며, 그 옆에 입력 한 후 경과 된 시간 (초)이 있으면 좋을 것입니다.

2012-05-20 19:18:41.0924|INFO|HashMatcher.LocalMatcherControl|99 archives discovered 
    2012-05-20 19:18:56.5267|INFO|HashMatcher.LocalMatcherControl|memory usage BEFORE loading samples 283.06 Mb 
    2012-05-20 19:18:56.5267|INFO|HashMatcher.LocalMatcherControl|performing sample scan 
    2012-05-20 19:19:08.9131|INFO|HashMatcher.LocalMatcherControl|memory usage BEFORE creating progress 285.43 Mb 
    2012-05-20 19:20:16.5804|INFO|HashMatcher.LocalMatcherControl|skipped progress 0 
    2012-05-20 19:20:17.6100|INFO|HashMatcher.LocalMatcherControl|memory usage BEFORE sorting progress 205.06 Mb 

답변

2

나는 "자유"이 기능을 제공 NLog에 내장되어있는 일이 있다고 생각하지 않지만, 사용자 정의 LayoutRenderer를 사용하여 아주 쉽게 스스로를 구현할 수 있어야합니다. here의 예제 (NLog의 소스 저장소에 있음)를 찾을 수 있습니다.

당신은 (내게로도 컴파일도 테스트)이 같은 끝낼 수 있습니다

[LayoutRenderer("ElapsedTime")] 
[ThreadAgnostic]  
public class ElapsedTimeLayoutRenderer : LayoutRenderer  
{   
    DateTime? lastTimeStamp; 

    public ElapsedTimeLayoutRenderer() 
    {    
    }   


    protected override void Append(StringBuilder builder, LogEventInfo logEvent)   
    {    
    var stamp = logEvent.TimeStamp; 

    var span = stamp - lastTimeStamp.HasValue ? lastTimeStamp : stamp; 

    builder.Append(stamp.ToString());   

    lastTimeStamp = stamp; 
    }  
} 

는 본질적으로 레이아웃 렌더러는 기록 된 마지막 메시지의 타임 스탬프를 기억합니다. 이 레이아웃 렌더러의 값은 마지막으로 기록 된 메시지와 현재 메시지의 시간 스탬프 사이의 차이입니다. 이 레이아웃 렌더러는 몇 가지 향상된 기능을 사용할 수 있습니다. DateTime을 보면 CultureInfo 및 Format 속성도 있음을 알 수 있습니다. 필요에 따라 응용 프로그램 시작 이후 (또는 적어도 첫 번째 메시지가 기록 된 이후부터) 경과 시간을 제공하는 옵션을 제공 할 수도 있습니다.

또한 멤버 변수가 수정되고 있기 때문에 (lastTimeStamp) lock 문으로 보호해야합니다.

이 기능을 사용하면 필요한 기능을 얻을 수 있습니다.

행운을 빈다. 위의 설정 라인이 실행되기 전에

+0

유망 해 보입니다. 코드를 가져 주셔서 감사합니다! 나는 그것을 시도하고 다시보고 할 것이다! –

+0

나는 그것을 작동 시키려고 노력하고 있고 문제가있다 : 프로그램 시작시 TypeInitializationException ... 어떤 스택 추적도없이 ... 어떤 힌트라도? 나는 구글, 아무도 그 문제가 있습니다. –

1
[LayoutRenderer("elapsedtime")] 
[ThreadAgnostic] 
public class ElapsedTimeLayoutRenderer : LayoutRenderer 
{ 
    Stopwatch sw; 

    public ElapsedTimeLayoutRenderer() 
    { 
    this.sw = Stopwatch.StartNew(); 
    } 

    protected override void Append(StringBuilder builder, LogEventInfo logEvent) 
    { 
    builder.Append(this.sw.ElapsedMilliseconds.ToString().PadLeft(6)); 
    this.sw.Restart(); 
    } 
} 

그런 다음 로깅이 발생하지 않습니다, 프로그램

ConfigurationItemFactory.Default.LayoutRenderers.RegisterDefinition("elapsedtime", typeof (ElapsedTimeLayoutRenderer)); 

노트

의 시작 에서 너무 정적 로거를이 렌더러를 등록 회원은

static Logger logger = LogManager.GetCurrentClassLogger(); 
이 렌더러를 사용하는

은이 줄 앞에이 허용되지 않습니다. 입니다. config에 렌더러를 구성하는 방법을 알고 있다면 주석을 달거나 편집하십시오.

관련 문제