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

标签 serilog seq-logging getseq

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

我想记录此事件,并将其每个属性显示在 Seq 中 - 作为属性。但是,想要省略实际日志消息文本中的大部分属性 - 所以我不希望它们出现在消息模板中。 v

如果我这样做:

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

Seq 中直接针对日志亮起的唯一属性是 @event 属性。它实际上看起来像这样:

enter image description here

所以我尝试了这个:

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

但我对这种方法的担忧是,由于该方法将触发大量次,我不希望每次都创建一个新的丰富对象实例 - 因为我喜欢保留创建的对象通常尽可能低。只是因为我担心 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 的有趣属性来获得更严格和更有效的结果。 .

还有一件小事 - 没有必要打电话 Log.Logger在静态类上; Log有类似 Information() 的方法直接在上面,如Log.Information(...) .

关于Serilog with Seq - 添加属性而不放置在消息文本中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39908001/

相关文章:

logging - Seq API key 问题

azure - Serilog Seq Sink 并不总是捕获事件

c# - 有没有办法通过 appsettings.json 设置 Serilog 格式化程序变量?

c# - 如何为不同的接收器以不同的方式覆盖 Serilog 级别?

.net-core - 将 Serilog 与 .Net core 和 App Insights 结合使用

c# - Serilog 中的异常解构

c# - 如何使用 serilog 自定义异常输出

.net-core - Serilog 将空白 CorrelationId 发送到 Seq 记录器