Dot-Net

是否可以在輸出模板中獲取時間戳作為 DateTimeKind.Utc?

  • April 14, 2022

目前,當我{Timestamp}在 outputTemplate 中使用它時,它似乎是由它生成的DateTime.Now,因此很有DateTimeKind.Local味道,因為當我給它一個“o”說明符時,它會產生類似於2016-02-12T09:51:34.4477761-08:00

對於上面的例子,我想得到的是,2016-02-12T17:51:34.4477761Z如果.Timestamp``DateTimeKind.Utc

更新

看起來它實際上是DateTimeOffset 在那裡被實例化,所以沒有DateTimeKind生效,而是看起來底層DateTime總是DateTimeKind.Unspecified. MSDN指出,格式化DateTimeOffsetvs時的行為存在一些差異DateTime,特別是:

“u” – 將 DateTimeOffset 值轉換為 UTC 並使用格式 yyyy-MM-dd HH:mm:ssZ 輸出。

轉換正是我想要的,但我也需要分數。

格式的限制似乎DateTimeOffset會阻礙這一點。

另一種選擇(只要附加屬性不會在其他地方膨脹輸出)是將 Serilog 添加ILogEventEnricher到管道中:

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

然後,您可以{UtcTimestamp:o}在輸出模板中使用以獲取所需的值。

引用自:https://stackoverflow.com/questions/35369491