'Is it possible to get Timestamp in output template as DateTimeKind.Utc?
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.
Solution 1:[1]
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.
Solution 2:[2]
Serilog.Expressions now supports formatting DateTimeOffset
as UTC without any additional enrichment:
// dotnet add package serilog.expressions
.WriteTo.Console(new ExpressionTemplate(
"[{UtcDateTime(@t):o} {@l:u3}] {@m}\n{@x}",
theme: TemplateTheme.Code))
Note that the timestamp property is now @t
, not Timestamp
.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Nicholas Blumhardt |
Solution 2 | Nicholas Blumhardt |