Serilog with Seq - 添加属性而不放置在消息文本中

Serilog with Seq - Adding Properties without Placing in Message Text

我有一个对象,它有几个属性与我网站上刚刚发生的事件有关。

我想记录此事件,并希望它的每个属性都作为属性出现在 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);
        }

但我对这种方法的担忧是,由于这种方法会被触发很多次,我不想每次都创建一个新的 enricher 对象实例 - 因为我喜欢保留通常创建的对象数量尽可能少。只是因为我担心 GC 的影响(也许我的担忧是没有根据的?)。

这是实现我想要的(即使用增强剂)的正确/正确方法还是我遗漏了什么?

干杯!

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.[=19 的有趣属性来获得更紧凑和更有效的结果=]

另一件小事 - 没有必要在静态 class 上调用 Log.LoggerLog 直接有像 Information() 这样的方法,如 Log.Information(...).