使用来自父 TPL 任务的上下文补充/覆盖 System.Diagnostic.Trace 消息
Supplement / override System.Diagnostic.Trace messages with context from parent TPL Task
我有一个基于插件的系统,它大量使用 .Net Task<> / TPL 来执行并行工作流。 worker 是执行各种任务的插件,在主处理应用程序之外构建,编译为 DLL 并放入插件目录。
worker 插件将使用 Trace 消息来输出它们正在做的事情。我很乐意用仅在父应用程序中已知的附加上下文信息来补充这些 Trace 消息。这也意味着我需要以某种方式弄清楚跟踪消息来自什么上下文(它来自哪个 Task<>)
具体用例:
- 父应用程序从队列中选择 "work" 待完成。
- 应用程序找到合适的工作插件来执行所请求的工作类型
- Parent 为插件在其中工作创建一个新的 Task<>,建立一个 WorkID 以关联到此工作任务并启动进程
- 当插件使用 Trace.WriteLine() 之类的东西时,我希望该消息补充有从主应用程序建立的 WorkID(插件对此一无所知)
我知道我可以将日志记录实现传递给插件,但随后我必须重新编写我期望的所有插件,并使用该日志记录实现。
有办法实现吗?
根据@barakcaf 的建议,我调查了 CallContext
并解决了我的问题。
示例:
public async Task TopFunction(string someContextualData)
{
CallContext.LogicalSetData("MyVar", someContextualData);
await ChildFunction();
}
public async Task ChildFunction()
{
string someContextualData = (string)CallContext.LogicalGetData("MyVar");
}
我有一个基于插件的系统,它大量使用 .Net Task<> / TPL 来执行并行工作流。 worker 是执行各种任务的插件,在主处理应用程序之外构建,编译为 DLL 并放入插件目录。
worker 插件将使用 Trace 消息来输出它们正在做的事情。我很乐意用仅在父应用程序中已知的附加上下文信息来补充这些 Trace 消息。这也意味着我需要以某种方式弄清楚跟踪消息来自什么上下文(它来自哪个 Task<>)
具体用例:
- 父应用程序从队列中选择 "work" 待完成。
- 应用程序找到合适的工作插件来执行所请求的工作类型
- Parent 为插件在其中工作创建一个新的 Task<>,建立一个 WorkID 以关联到此工作任务并启动进程
- 当插件使用 Trace.WriteLine() 之类的东西时,我希望该消息补充有从主应用程序建立的 WorkID(插件对此一无所知)
我知道我可以将日志记录实现传递给插件,但随后我必须重新编写我期望的所有插件,并使用该日志记录实现。
有办法实现吗?
根据@barakcaf 的建议,我调查了 CallContext
并解决了我的问题。
示例:
public async Task TopFunction(string someContextualData)
{
CallContext.LogicalSetData("MyVar", someContextualData);
await ChildFunction();
}
public async Task ChildFunction()
{
string someContextualData = (string)CallContext.LogicalGetData("MyVar");
}