是否可以将输出模板中的Timestamp作为DateTimeKind.Utc?

时间:2016-02-12 18:14:31

标签: .net serilog

目前,当我在outputTemplate中使用{Timestamp}时,它似乎是由DateTime.Now生成的,因此具有DateTimeKind.Local味道,因为当我给它一个" o&# 34;说明符,它产生类似于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时的行为存在一些差异,具体为:

  

" U" - 将DateTimeOffset值转换为UTC并使用格式yyyy-MM-dd HH:mm:ssZ输出。

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

1 个答案:

答案 0 :(得分:9)

DateTimeOffset格式化的限制似乎会阻碍这一点。

替代方案(只要附加属性不会在其他地方膨胀输出)是向管道添加Serilog ILogEventEnricher

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

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