2
votes

Serilog: Puis-je ajouter une propriété sans ajouter au message?

J'ai une application WIndows .NET et je commence à utiliser Serilog. J'initialise ceci comme ceci:

using (var __log = _log.PushProperty("order", order)
{
  __log.Verbose ("Hit {orderID}", orderID);
}

Et je l'utilise comme ceci:

_log = Log.ForContext<GameBase>()
.ForContext("InstrumentID", InstrumentId);
_log.Verbose("This is an order: {orderID} / {order}", order.OrderID, order);

Je voudrais que mon OrderID soit affiché dans le message et j'aimerais que l'objet order soit inclus en tant que propriété (afin que je puisse y accéder lorsque je creuse dans cet événement dans Seq) mais je ne veux pas que le message lui-même contienne l'objet (trop gros). Y a-t-il un moyen de faire cela?

Ou alors j'ai besoin de quelque chose comme ça:

Log.Logger = new LoggerConfiguration()
  .MinimumLevel.Verbose()
.Enrich.With(new ThreadIdEnricher())
.Enrich.WithProperty("BuildId", Guid.NewGuid()) // One Guid per run.
.Enrich.FromLogContext()
.WriteTo.RollingFile(@"C:\QRT\Logs\QRT-LOG.txt", LogEventLevel.Verbose)
.WriteTo.Seq("http://localhost:5341" )
.WriteTo.Console(outputTemplate:"{Source} BLAHBLAH {Message:lj}")
.WriteTo.File(new CompactJsonFormatter(), "C:/QRT/Logs/log.json")
.CreateLogger();

On dirait beaucoup de code ... p >


0 commentaires

3 Réponses :


0
votes

Oui, mais il y a des trucs étranges impliqués


eta exemple:

var _log = Log.ForContext<GameBase>()
    .ForContext("InstrumentID", InstrumentId);

_log.ForContext(new ScalarEnricher("order",order)).Verbose("Hit: {orderID}", order.OrderID);

consommé comme ça:

class ScalarValueEnricher : ILogEventEnricher
{
    readonly LogEventProperty _prop;

    public ScalarValueEnricher(string name, object value)
    {
        _prop = new LogEventProperty(name, new ScalarValue(value));
    }

    public void Enrich(LogEvent evt, ILogEventPropertyFactory _)
    {
         evt.AddPropertyIfAbsent(_prop);
    }
}

Vous pouvez aussi bien sûr créer des temporaires à partir de _log.ForContext (new ScalarEnricher ("order", order)) où c'est plus propre / plus clair / plus efficace.


2 commentaires

Merci mais il semble que votre code suggère d'utiliser le "Utilisation" ... mais une simple conversion en scalaire. Donc, je suppose que la réponse est non ... Je dois utiliser pour pousser la propriété en utilisant "Utilisation" si je ne le veux pas dans le message. J'aimerais pouvoir trouver de la documentation sur les enrichisseurs ...


Il y a une surcharge de ForContext qui prend un enricher, permettez-moi d'ajouter et des exemples ...



1
votes
_log.ForContext("order", order, true).Verbose("Hit {orderID}", orderID);
The true here tells Serilog to serialized ("destructure") order instead of calling its ToString() method.

0 commentaires

2
votes

Vous pouvez ajouter un autre objet For Context à votre enregistreur pour l'objet order de la même manière que vous ajoutez InstrumentED et il sera inclus en tant que propriété

_log = Log.ForContext<GameBase>()
    .ForContext("InstrumentID", InstrumentId)
    .ForContext("Order", order, true);

_log.Verbose("This is an order: {orderID}", order.OrderID);


0 commentaires