2012-05-20 16 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),因此可能應該使用鎖定語句來保護該成員變量。

希望這會幫助您獲得所需的功能。

祝你好運!

+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(); 
使用此渲染器的

在此行之前是不允許。如果有人知道如何在配置中配置渲染器,請評論或編輯。