2

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

如果我输入一个日志语句,如......

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

在序列中,我得到...

在此处输入图像描述

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

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

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

该应用程序是一个 Windows 服务,它产生多个执行不同操作的活动。因此,Windows 服务会编排其中包含的各种活动。在时间表上,它只是在每个活动上调用“流程”以开始并做一些工作。每次流程被编排器调用时,我都需要该 Activity 的所有日志记录以自动包含 Site 和 Activity 值,如上所示(以及更多属性值,但我不希望它们全部打印在消息行中)。

因此,我们将看到的不是上面的条目,而是...注意消息现在只显示“ProcessCycle”。

在此处输入图像描述

4

1 回答 1

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

需要改为:

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

随心所欲地渲染。

您也可以在全球范围内做Enrich.FromLogContext和做LogContext.PushProperty(搜索这两个字符串以查找示例)。

由约翰利弗莫尔添加

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

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

于 2018-11-15T22:25:10.670 回答