2016-10-07 13 views
2

У меня есть объект с несколькими свойствами, относящимися к событию, которое только что произошло на моем веб-сайте.Serilog with Seq - Добавление свойств без размещения в тексте сообщения

Я хочу зарегистрировать это событие и для каждого его свойства появиться в свойствах Seq - as. Однако хотите опустить большинство свойств из фактического текста сообщения журнала, поэтому я не хочу их в шаблоне сообщения. v

Если я это сделать:

 var logInfo= new LogInfo() {Foo = 1, Bar= "Pending"}; 
     logger.Information("{@event}", logInfo); 

Единственное свойство, которое зажигает в послед непосредственно против журнала, является @event свойство. Это на самом деле выглядит следующим образом:

enter image description here

Так что я попытался это:

 var enricher = new DnnLogInfoEnricher(logInfo); 
     using (LogContext.PushProperties(enricher)) 
     { 
      Log.Logger.Information("Event: {logInfo}", logInfo.LogTypeKey, logInfo.Exception); 
     } 

Но моя озабоченность в связи с этим подходом является то, что этот метод будет стрелять огромное количество раз, я Не рекомендуется создавать новый экземпляр объекта-обогатителя каждый раз, так как мне нравится поддерживать как можно более низкое количество объектов. Просто потому, что меня беспокоят последствия GC (возможно, мои опасения необоснованны?) ,

Это правильный/правильный способ достичь того, чего я хочу (например, с помощью обогатителя), или я чего-то не хватает?

Cheers!

ответ

1

Serilog-х ForContext() достаточно хорошо оптимизирован для такого рода сценария и не будет создавать тоже много мусора (он выходит из своего пути, чтобы избежать его там, где это возможно). Стоимость создания контекста не будет существенной пропорционально стоимости регистрации данных для начала.

var log = Log.ForContext("Info", logInfo, destructureObjects: true); 
log.Information(logInfo.Exception, "Event happened"); 

одно наблюдение, вы могли бы быть лучше исключить исключение из захваченного объекта и передать его через в качестве первого параметра вызова журналирования вместо этого. Чтобы исключить это, вы можете создать пользовательскую политику, когда создается регистратор:

Log.Logger = new LoggerConfiguration() 
    .Destructure.ByTransforming<LogInfo>(li => new { 
     li.BypassBuffering, li.LogConfigId, li.LogEventId, li.LogGUID 
    }) 
    // <snip> 
    .CreateLogger(); 

Хотя ByTransforming() может показаться, чтобы добавить больше накладные расходы здесь, вы должны быть в состоянии получить гораздо более жесткий и более эффективный результат, Cherry- выбирая только интересные свойства LogInfo.

Еще одна второстепенная вещь - нет необходимости называть Log.Logger статическим классом; Log имеет такие методы, как Information() на нем, как в Log.Information(...).