使用属性丰富 Seq 日志语句,而不将它们也包含在消息行中(使用 Serilog)

Enrich Seq log statements with properties without also including them in the message line (using Serilog)

我正在将 Serilog 与 Seq 结合使用,并希望使用我自己的属性来丰富出现在 Seq 中的日志记录。

如果我输入这样的日志语句...

Log.Information("ProcessCycle {Site} {Activity}", SiteName, ActivityName);

在 Seq 中我得到...

请注意站点和 Activity 值在 Seq 中显示为丰富的属性,但它们也显示在整个消息中。

如何记录我在哪里获得了丰富的属性,但没有在文本消息行中显示这些值?请注意,我有一个 NuGet 包,它为每个调用添加了一个 ThreadId。我希望 Site 和 Activity 属性在丰富的道具列表中,但不一定打印在消息行中。

这个问题的答案可能还需要了解我们的应用程序。

该应用程序是一个 windows 服务,它生成多个执行不同操作的活动。因此 windows 服务协调其中包含的各种活动。按照计划,它只是在每个 activity 上调用 'Process' 来完成一些工作。每次流程由编排器调用时,我需要通过 Activity 进行所有记录以自动包含 Site 和 Activity 值,如上所示(以及更多 属性 值,但我不'希望它全部打印在消息行中)。

所以我们将看到的不是上面的条目,而是...... 请注意,消息现在显示为 "ProcessCycle".

Log.Information("ProcessCycle {Site} {Activity}", SiteName, ActivityName);

需要改为:

Log.ForContext("Site",SiteName)
    .ForContext("Activity",ActivityName)
    .Information("ProcessCycle")

随心所欲地渲染。

您还可以执行 Enrich.FromLogContextLogContext.PushProperty 以更全面地执行此操作(搜索这两个字符串以查找示例)。

约翰·利弗莫尔添加

有关 FromLogContext 和其他方法的更多信息,请访问... https://nblumhardt.com/2016/08/context-and-correlation-structured-logging-concepts-in-net-5/

FromLogContext 创建一个 ILogger,可在后续日志记录调用的范围内使用。