C# 使用PostSharp记录具有公共guid的嵌套分布式函数调用
目前,多层系统的每个组件都使用PostSharp记录所有函数调用 e、 g.对WCF服务的应用程序调用可能会提示对DataService(进程中)和AuditService(通过NServiceBus)的调用 这将导致向日志表写入四行,但当稍后查看日志表时,无法识别C# 使用PostSharp记录具有公共guid的嵌套分布式函数调用,c#,postsharp,C#,Postsharp,目前,多层系统的每个组件都使用PostSharp记录所有函数调用 e、 g.对WCF服务的应用程序调用可能会提示对DataService(进程中)和AuditService(通过NServiceBus)的调用 这将导致向日志表写入四行,但当稍后查看日志表时,无法识别logCaseAccess()调用是否作为封闭的getCase()应用程序调用的一部分被调用 如果能够将这四行标识为一个组,则会更加有用 我可以看到应用程序如何生成一个Guid,该Guid可以作为参数传递给每个后续调用,但这不是只有通
logCaseAccess()
调用是否作为封闭的getCase()
应用程序调用的一部分被调用
如果能够将这四行标识为一个组,则会更加有用
我可以看到应用程序如何生成一个Guid,该Guid可以作为参数传递给每个后续调用,但这不是只有通过更改解决方案中每个函数的签名才能实现的吗?该解决方案已经包括20多个服务,包括200多个运营合同,因此这将是相当大的努力
是否有一种方法可以修改每个服务,使它们的每个函数都知道需要一个额外的参数(Guid),并将其传递给任何后续调用(可能使用PostSharp方法边界)
我读过这篇(),但不幸的是它没有解决我需求的分布式(和多线程)性质:如果您只有同步代码,那么在日志中标识调用堆栈的问题通常通过在输出中包含当前线程ID来解决。这通常可以在底层日志框架中配置。例如,使用log4net:
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%thread] %message%newline" />
</layout>
调用是异步的还是同步的?对WCF服务的调用是同步的,但它们通过NServiceBurst调用其他服务。这真的很有帮助,一开始看起来可以解决我的问题,但不幸的是,在后续调用中是否保留
CallContext
似乎有些随意。我不知道它是否相关,但我尝试记录的服务是InstanceContextMode.Single
和ConcurrencyMode.Multiple
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%thread] %message%newline" />
</layout>
[Serializable]
public class TestAspect : OnMethodBoundaryAspect
{
private const string Name = "LogId";
public TestAspect()
{
this.ApplyToStateMachine = true;
}
public override void OnEntry(MethodExecutionArgs args)
{
object contextId = CallContext.LogicalGetData(Name);
if (contextId == null)
{
contextId = Guid.NewGuid().ToString();
CallContext.LogicalSetData(Name, contextId);
}
// Build the log message and send the output to the underlying framework
Console.WriteLine("{0}: {1}", contextId, args.Method.Name);
}
}