当前,当我在outputTemplate中使用{Timestamp}
时,它似乎是由DateTime.Now
生成的,因此具有DateTimeKind.Local
的 flavor ,因为当我给它指定“o”说明符时,它会产生类似于2016-02-12T09:51:34.4477761-08:00
的输出
对于上面的示例,我想获取的是2016-02-12T17:51:34.4477761Z
,如果Timestamp
是DateTimeKind.Utc
,则应该生成它。
更新
看起来实际上是DateTimeOffset that gets instantiated there,因此没有DateTimeKind
生效,而是看起来底层DateTime
始终是DateTimeKind.Unspecified
。 MSDN指出,在格式化DateTimeOffset
与DateTime
时,行为上会有一些差异,特别是:
转换正是我想要的,但我也需要分数。
最佳答案
看来DateTimeOffset
格式的局限性将阻止这种情况。
一种替代方法(只要附加属性不会使其他地方的输出膨胀),就可以在管道中添加Serilog ILogEventEnricher
:
class UtcTimestampEnricher : ILogEventEnricher {
public void Enrich(LogEvent logEvent, ILogEventPropertyFactory lepf) {
logEvent.AddPropertyIfAbsent(
lepf.CreateProperty("UtcTimestamp", logEvent.Timestamp.UtcDateTime));
}
}
然后,您可以在输出模板中使用
{UtcTimestamp:o}
来获取所需的值。