2015-02-12 72 views
1

我對使用異步目標時在NLog中的時間戳感到好奇。NLog異步目標時間戳

我知道根據this question,當日志條目排隊時,會生成時間戳,就像您期望的那樣。

但是,我注意到我的日誌文件中有一些東西,所以我決定快速進行測試。

static void Main(string[] args) 
    { 
     for (int i = 0; i < 10000; i++) 
     { 
      _logger.Info("Timestamp: {0}, LogNumber: {1}",DateTime.Now.ToString("HH:mm:ss.fff"), i); 
     } 
     _logger.Factory.Flush(); 
    } 

我NLog.config樣子:

<?xml version="1.0" encoding="utf-8" ?> 
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <targets async="true"> 

    <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log" 
      layout="${longdate} ${uppercase:${level}} ${message}" /> 
    </targets> 

    <rules> 
    <logger name="*" minlevel="Trace" writeTo="f" /> 
    </rules> 
</nlog> 

現在,如果我查看輸出,我們看到754 9962之間,所有條目具有相同NLOG時間戳,但是,DateTime.Now顯示毫秒進展:

2015-02-12 08:19:23.3814 INFO Timestamp: 08:19:23.376, LogNumber: 0 
... 
2015-02-12 08:19:23.3853 INFO Timestamp: 08:19:23.384, LogNumber: 754 
... 
2015-02-12 08:19:23.4033 INFO Timestamp: 08:19:23.399, LogNumber: 9963 
... 

我可以理解,隨着費用的0.384一個DateTime.Now郵票可以被記錄的0.385,但是,它沒有任何意義,我認爲0.399出來爲.385。

NLog時間戳進展的方式幾乎看起來像是在記錄週期期間生成的timstamp,而不是日誌調用。這將違背上述文章。

那麼,這是否與NLog使用的時間源有關,或者更確切地說,是何時生成時間戳?

回答

0

您看到的行爲是由NLog的時間源系統定義的。

NLog 4.x提供4種不同的時間源,你可以插入你自己的。 NLog的默認時間源針對性能進行了優化,並對正在返回的值進行緩存。緩存機制使用Environment.TickCount時間間隔爲新的日誌條目返回時間戳。 TickCount屬性的分辨率限於系統定時器的分辨率,該定時器不是固定值,而是通常在10-16毫秒範圍內變化。

因此,您看到的效果是由NLog的默認時間源定義的。而且,順便說一句,它不是特定於異步目標 - 從您的示例中刪除異步屬性,你會看到完全相同的行爲。

如果您需要在您的日誌事件時間戳更精確的分辨率,可以配置NLOG使用其他時間源:

<nlog> 
    <time type="AccurateUTC" /> 
</nlog> 

然而,這並不能保證所有的活動都會有不同的時間郵票,你可能會在同一時間獲得2-3個活動。但it will use straight value of DateTime.UtcNow填寫日誌事件的日期/時間字段,沒有任何緩存。並沒有任何日期時區轉換太...

您可以找到更多關於time sources in NLog wiki的信息