C# 使用PostSharp记录具有公共guid的嵌套分布式函数调用

C# 使用PostSharp记录具有公共guid的嵌套分布式函数调用,c#,postsharp,C#,Postsharp,目前,多层系统的每个组件都使用PostSharp记录所有函数调用 e、 g.对WCF服务的应用程序调用可能会提示对DataService(进程中)和AuditService(通过NServiceBus)的调用 这将导致向日志表写入四行,但当稍后查看日志表时,无法识别logCaseAccess()调用是否作为封闭的getCase()应用程序调用的一部分被调用 如果能够将这四行标识为一个组,则会更加有用 我可以看到应用程序如何生成一个Guid,该Guid可以作为参数传递给每个后续调用,但这不是只有通

目前,多层系统的每个组件都使用PostSharp记录所有函数调用

e、 g.对WCF服务的应用程序调用可能会提示对DataService(进程中)和AuditService(通过NServiceBus)的调用

这将导致向日志表写入四行,但当稍后查看日志表时,无法识别
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);
    }
}