NLog异步目标时间戳

时间:2015-02-12 08:38:07

标签: 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
...

我可以理解,通过开销,.384的DateTime.Now标记可以记录为.385,但是,对我来说没有意义.399出现为.385。

NLog时间戳的进展方式,几乎就像在记录周期中生成的timstamp,而不是日志调用。这与上述文章相反。

那么,这是否与NLog使用的时间源有关,或者更确切地说,是何时生成时间戳?

1 个答案:

答案 0 :(得分:0)

您看到的行为是由NLog的时间源系统定义的。

NLog 4.x提供4种不同的时间源,您可以插入自己的时间源。 NLog的默认时间源针对性能进行了优化,并对正在返回的值进行了一些缓存。缓存机制使用Environment.TickCount间隔来返回新日志条目的时间戳。 TickCount属性的分辨率仅限于系统定时器的分辨率,该分辨率不是固定值,但通常在10-16 ms范围内变化。

因此,您看到的效果是由NLog的默认时间源定义的。而且,顺便说一句,它不是特定于异步目标 - 从您的示例中删除异步属性,您将看到完全相同的行为。

如果您需要更精确地解决日志事件中的时间戳,可以将NLog配置为使用其他时间源:

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

但是,这并不能保证您的所有活动都有不同的时间戳,您可能会同时获得2-3个活动。但it will use straight value of DateTime.UtcNow填写日志事件的日期/时间字段,没有任何缓存。而且没有任何日期时区转换......

您可以找到有关time sources in NLog wiki

的更多信息