如何在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 中的演练 - 其中一些将是老掉牙的内容,但其中有很多微妙之处,因为您已经 运行 在这种情况下。
我有一个应用程序,我在其中使用任务并行处理结果集中的项目。
每次执行都涉及跨不同执行路径的公共函数的嵌套调用。
我希望能够在日志中标记特定的执行链,以了解哪些消息属于特定工作项的处理。
我将 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 中的演练 - 其中一些将是老掉牙的内容,但其中有很多微妙之处,因为您已经 运行 在这种情况下。