Currently when I use {Timestamp}
in an outputTemplate it appears to have been generated by DateTime.Now
and therefore being of DateTimeKind.Local
flavor since, when I give it an "o" specifier it produces output similar to 2016-02-12T09:51:34.4477761-08:00
What I'd like to get instead for the above example is 2016-02-12T17:51:34.4477761Z
, which would have been produced had the Timestamp
been of DateTimeKind.Utc
.
Update
It looks like it is actually DateTimeOffset that gets instantiated there so no DateTimeKind
is in effect, rather it looks like underlying DateTime
is always of DateTimeKind.Unspecified
. MSDN notes that there is some difference in behavior when formatting DateTimeOffset
vs DateTime
, specifically:
"u" -- Converts the DateTimeOffset value to UTC and outputs it using the format yyyy-MM-dd HH:mm:ssZ.
The conversion is exactly what I want but I also need fractions.
It appears the limitation in DateTimeOffset
formatting is going to thwart this.
An alternative (so long as the additional property doesn't bloat output somewhere else) is to add a Serilog ILogEventEnricher
to the pipeline:
class UtcTimestampEnricher : ILogEventEnricher {
public void Enrich(LogEvent logEvent, ILogEventPropertyFactory lepf) {
logEvent.AddPropertyIfAbsent(
lepf.CreateProperty("UtcTimestamp", logEvent.Timestamp.UtcDateTime));
}
}
You can then use {UtcTimestamp:o}
in your output template to get the value you need.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With