当前,当我在outputTemplate中使用{Timestamp}时,它似乎是由DateTime.Now生成的,因此具有DateTimeKind.Local的 flavor ,因为当我给它指定“o”说明符时,它会产生类似于2016-02-12T09:51:34.4477761-08:00的输出

对于上面的示例,我想获取的是2016-02-12T17:51:34.4477761Z,如果TimestampDateTimeKind.Utc,则应该生成它。

更新

看起来实际上是DateTimeOffset that gets instantiated there,因此没有DateTimeKind生效,而是看起来底层DateTime始终是DateTimeKind.UnspecifiedMSDN指出,在格式化DateTimeOffsetDateTime时,行为上会有一些差异,特别是:



转换正是我想要的,但我也需要分数。

最佳答案

看来DateTimeOffset格式的局限性将阻止这种情况。

一种替代方法(只要附加属性不会使其他地方的输出膨胀),就可以在管道中添加Serilog ILogEventEnricher:

class UtcTimestampEnricher : ILogEventEnricher {
  public void Enrich(LogEvent logEvent, ILogEventPropertyFactory lepf) {
    logEvent.AddPropertyIfAbsent(
      lepf.CreateProperty("UtcTimestamp", logEvent.Timestamp.UtcDateTime));
  }
}

然后,您可以在输出模板中使用{UtcTimestamp:o}来获取所需的值。

10-06 02:44