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(...),

Другие вопросы по тегам