Est-il possible d'obtenir Timestamp dans le modèle de sortie en tant que DateTimeKind.Utc ?

Actuellement, lorsque j'utilise {Timestamp}dans un outputTemplate, il semble avoir été généré par DateTime.Nowet donc être de DateTimeKind.Localsaveur puisque, lorsque je lui donne un spécificateur "o", il produit une sortie similaire à2016-02-12T09:51:34.4477761-08:00

Ce que j'aimerais obtenir à la place pour l'exemple ci-dessus est 2016-02-12T17:51:34.4477761Z, qui aurait été produit s'il avait Timestampété de DateTimeKind.Utc.

Mise à jour

Il semble que ce soit en fait DateTimeOffset qui y soit instancié, donc no DateTimeKindest en vigueur, il semble plutôt que le sous-jacent DateTimesoit toujours de DateTimeKind.Unspecified. MSDN note qu'il existe une différence de comportement lors du formatage par DateTimeOffsetrapport DateTimeà, en particulier :

"u" -- Convertit la valeur DateTimeOffset en UTC et l'affiche au format aaaa-MM-jj HH:mm:ssZ.

La conversion est exactement ce que je veux mais j'ai aussi besoin de fractions.


Solution du problème

Il semble que la limitation du DateTimeOffsetformatage va contrecarrer cela.

Une alternative (tant que la propriété supplémentaire ne gonfle pas la sortie ailleurs) consiste à ajouter un Serilog ILogEventEnricherau pipeline :

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

Vous pouvez ensuite l'utiliser {UtcTimestamp:o}dans votre modèle de sortie pour obtenir la valeur dont vous avez besoin.

Commentaires

Posts les plus consultés de ce blog

Erreur Symfony : "Une exception a été levée lors du rendu d'un modèle"

Détecter les appuis sur les touches fléchées en JavaScript

Une chaîne vide donne "Des erreurs ont été détectées dans les arguments de la ligne de commande, veuillez vous assurer que tous les arguments sont correctement définis"