2016-02-12 23 views
8

Attualmente quando uso {Timestamp} in un outputTemplate esso sembra essere stato generato da DateTime.Now e quindi essendo di sapore DateTimeKind.Local dal momento che, quando gli ho dato una "o" identificatore che produce un risultato simile al 2016-02-12T09:51:34.4477761-08:00È possibile ottenere il timestamp nel modello di output come DateTimeKind.Utc?

Quello che mi piacerebbe per ottenere invece l'esempio sopra riportato è 2016-02-12T17:51:34.4477761Z, che sarebbe stato prodotto se lo Timestamp fosse stato di DateTimeKind.Utc.

Aggiornamento

Sembra che in realtà è DateTimeOffset that gets instantiated there quindi non DateTimeKind è a tutti gli effetti, anzi sembra che alla base DateTime è sempre di DateTimeKind.Unspecified. MSDN osserva che v'è una certa differenza di comportamento durante la formattazione DateTimeOffset vs DateTime, in particolare:

"u" - Converte il valore DateTimeOffset per UTC e uscite utilizzando il formato AAAA-MM-GG HH: MM: SSZ .

La conversione è esattamente ciò che voglio ma ho anche bisogno di frazioni.

risposta

7

Sembra che la limitazione nella formattazione DateTimeOffset stia andando a ostacolare questo.

Un'alternativa (a condizione che la proprietà aggiuntiva non gonfiare uscita da qualche altra parte) è quello di aggiungere un Serilog ILogEventEnricher al gasdotto:

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

È quindi possibile utilizzare {UtcTimestamp:o} nel modello di output per ottenere il valore che ti serve