Serilog с Seq - Добавление свойств без размещения в тексте сообщения
У меня есть объект с несколькими свойствами, которые относятся к событию, которое только что произошло на моем сайте.
Я хочу записать это событие, и чтобы каждое из его свойств отображалось в Seq - как свойства. Однако я хочу опустить большинство свойств из фактического текста сообщения журнала - поэтому я не хочу, чтобы они были в шаблоне сообщения. v
Если я сделаю это:
var logInfo= new LogInfo() {Foo = 1, Bar= "Pending"};
logger.Information("{@event}", logInfo);
Единственное свойство, которое загорается в Seq прямо напротив журнала, это свойство @event. На самом деле это выглядит так:
Итак, я попробовал это:
var enricher = new DnnLogInfoEnricher(logInfo);
using (LogContext.PushProperties(enricher))
{
Log.Logger.Information("Event: {logInfo}", logInfo.LogTypeKey, logInfo.Exception);
}
Но моя проблема с этим подходом заключается в том, что, поскольку этот метод будет запускаться огромное количество раз, я бы предпочел не создавать каждый раз новый экземпляр более широкого объекта - так как мне нравится сохранять количество создаваемых объектов как правило, настолько низко, насколько это возможно. Просто потому, что я обеспокоен последствиями GC (возможно, мои опасения необоснованны?).
Это правильный / правильный способ достичь того, чего я хочу (то есть используя обогащение) или я что-то упускаю?
Ура!
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()
может показаться, что это добавляет больше накладных расходов, вы должны быть в состоянии получить намного более жесткий и эффективный результат, выбирая только интересные свойства LogInfo
,
Еще одна мелочь - не нужно звонить Log.Logger
на статический класс; Log
имеет такие методы, как Information()
на это прямо, как в Log.Information(...)
,