【问题标题】:Serilog with Seq - Adding Properties without Placing in Message TextSerilog with Seq - 添加属性而不放置在消息文本中
【发布时间】:2016-10-07 01:26:52
【问题描述】:

我有一个具有多个属性的对象,这些属性与我网站上刚刚发生的事件有关。

我想记录这个事件,并让它的每个属性出现在 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 的影响(也许我的担心是没有根据的?)。

这是实现我想要的正确/正确的方法(即使用浓缩器)还是我错过了什么?

干杯!

【问题讨论】:

    标签: serilog seq-logging getseq


    【解决方案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.LoggerLog 直接在其上具有 Information() 之类的方法,如 Log.Information(...)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      • 1970-01-01
      相关资源
      最近更新 更多