2015-02-12 21 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的信息