2016-02-12 16 views
8

Obecnie, gdy używam {Timestamp} w outputTemplate wydaje się być generowane przez DateTime.Now i dlatego jest od DateTimeKind.Local smaku, ponieważ gdy daję on „O” specifier produkuje wynik podobny do 2016-02-12T09:51:34.4477761-08:00Czy można uzyskać znacznik czasu w szablonie wyjściowym jako DateTimeKind.Utc?

Co chciałbym zamiast tego w powyższym przykładzie podano 2016-02-12T17:51:34.4477761Z, który zostałby wyprodukowany, gdyby Timestamp był z DateTimeKind.Utc.

Aktualizacja

Wygląda na to, że jest rzeczywiście DateTimeOffset that gets instantiated there więc nie DateTimeKind jest w rzeczywistości raczej wygląda bazowego DateTime jest zawsze DateTimeKind.Unspecified. MSDN, że istnieją pewne różnice w zachowaniu podczas formatowania DateTimeOffset vs DateTime, w szczególności:

"U" - przekształca wartość datetimeoffset do UTC i przesyła je za pomocą formacie MM-DD HH: MM: SSZ .

Konwersja jest dokładnie tym, czego chcę, ale potrzebuję również ułamków.

Odpowiedz

7

Wygląda na to, że ograniczenie w postaci DateTimeOffset będzie temu przeszkadzać.

Alternatywnym (tak długo, jak dodatkowa nieruchomość nie uwędzić wyjście gdzieś indziej) jest dodanie Serilog ILogEventEnricher rurociągu:

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

Można wówczas wykorzystać {UtcTimestamp:o} w szablonie wyjścia, aby uzyskać wartość, której potrzebujesz.