如何在Serilog中标记特定的处理链

How to mark a specific processing chain in Serilog

我有一个应用程序,我在其中使用任务并行处理结果集中的项目。 每次执行都涉及跨不同执行路径的公共函数的嵌套调用。 我希望能够在日志中标记特定的执行链,以了解哪些消息属于特定工作项的处理。
我将 Serilog 用作日志记录工具,调用静态 Log.Debug("....")、Log.Information("....") 等调用以避免传递 Log class 进入每个方法。 我尝试使用

_ = Log.ForContext("TaskID", $"Item Type 1: {UniqueItem1Id}");

_ = Log.ForContext("TaskID", $"Item Type 2: {UniqueItem2Id}");

根据功能,处理特定类型的数据。
我使用格式字符串

"{Timestamp:HH:mm:ss.fff} {TaskID} {Level:u3} {Message:lj}{NewLine}{Exception}"
期望 TaskID 占位符用 UniqueItemXId 填充。 但是,此尝试未能在日志中引入一个条目,在 TaskID 位置放置一个空字符串。

有什么方法可以把TaskID引入日志?

您需要做的:

var taskLog = Log.ForContext("TaskId", <value>);
taskLog.Information("Test"); // LogEvent will have the TaskId property in it

(Obv Log.ForContext("TaskId", <value>).Information("Test"); 等价)。

另一种选择,假设您将一组工作嵌套在块内的调用链中,是通过使用 the LogContext.

来完成 using LogContext.PushProperty("TaskId, <value>) { <do work>}

我建议您继续阅读 the best practices 以及 serilog.net 中的演练 - 其中一些将是老掉牙的内容,但其中有很多微妙之处,因为您已经 运行 在这种情况下。