我正在将Serilog与Seq一起使用,并希望使用自己的属性来丰富Seq中显示的日志记录。
如果我输入类似...的日志语句
Log.Information("ProcessCycle {Site} {Activity}", SiteName, ActivityName);
在Seq中,我得到...
请注意,“站点”和“活动”值在Seq中显示为丰富的属性,但也显示在整体消息中。
如何记录获得丰富属性的位置,但值没有出现在文本消息行中?注意,我有NuGet包,该包将ThreadId添加到每个调用。我希望“站点”和“活动”属性位于丰富的道具列表中,但不必打印在消息行中。
要获得答案,还可能需要了解我们的应用程序。
该应用程序是Windows服务,它产生多个执行不同操作的活动。因此,windows服务会编排其中包含的各种活动。在时间表上,它只是简单地在每个活动上调用“流程”以开始工作。每次由协调器调用Process时,我都需要该Activity进行的所有日志记录以自动包括如上所示的Site和Activity值(以及更多的属性值,但我不希望它们都打印在消息行中)。
因此,除了上面的条目外,我们还会看到... 请注意,消息现在仅显示“ ProcessCycle”。
答案 0 :(得分:3)
Log.Information("ProcessCycle {Site} {Activity}", SiteName, ActivityName);
需要更改为:
Log.ForContext("Site",SiteName)
.ForContext("Activity",ActivityName)
.Information("ProcessCycle")
根据需要渲染。
您还可以进行Enrich.FromLogContext
和LogContext.PushProperty
来更全局地进行搜索(搜索这两个字符串以查找示例)。
由John Livermore添加
有关FromLogContext和其他方法的更多信息,请参见... https://nblumhardt.com/2016/08/context-and-correlation-structured-logging-concepts-in-net-5/
FromLogContext创建一个ILogger,该ILogger可在范围内用于后续的日志记录调用。