如何使用C#Unity拦截记录中间调用

如何使用C#Unity拦截记录中间调用,c#,unity-container,unity-interception,C#,Unity Container,Unity Interception,我目前正在使用Unity Interceptor实现日志记录机制,但无法正确记录信息 当我调用MethodA时,MethodA和MethodB都会被记录,但我无法判断MethodB日志是由于MethodA还是其他MethodB调用引起的 我的问题是如何实现某种Id将它们链接在一起 预期: [Id:001]方法A被调用 [Id:001]方法B被调用 [Id:001]方法B已完成 public class A() { [Log] public void MethodA() {

我目前正在使用Unity Interceptor实现日志记录机制,但无法正确记录信息

当我调用MethodA时,MethodA和MethodB都会被记录,但我无法判断MethodB日志是由于MethodA还是其他MethodB调用引起的

我的问题是如何实现某种Id将它们链接在一起

预期:

[Id:001]方法A被调用

[Id:001]方法B被调用

[Id:001]方法B已完成

public class A() {
    [Log]
    public void MethodA() {
        var b = new B();
        b.MethodB();
    }
}

public class B() {
    [Log]
    public void MethodB () {
         // some action B
    }
}
[Id:001]方法A已完成

public class A() {
    [Log]
    public void MethodA() {
        var b = new B();
        b.MethodB();
    }
}

public class B() {
    [Log]
    public void MethodB () {
         // some action B
    }
}
当前:

[Id:001]方法A被调用

[Id:002]方法B被调用

[Id:002]方法B已完成

public class A() {
    [Log]
    public void MethodA() {
        var b = new B();
        b.MethodB();
    }
}

public class B() {
    [Log]
    public void MethodB () {
         // some action B
    }
}
[Id:001]方法A已完成

public class A() {
    [Log]
    public void MethodA() {
        var b = new B();
        b.MethodB();
    }
}

public class B() {
    [Log]
    public void MethodB () {
         // some action B
    }
}

您可以使用
CallContext
存储一些id并将其输出到日志中。如果您不想总是记录
publicstaticvoidmain
的id,那么主要的问题是识别调用的根

如果
MethodA
始终为root,则其工作原理如下:

public class A() {
    [Log]
    public void MethodA() {
        CallContext.SetLogicalData( "log-id", Guid.New().ToString() )
        var b = new B();
        b.MethodB();
    }
}

public class B() {
    [Log]
    public void MethodB () {
    // some action B
    }
}

//...
public void Log( string message )
{
    _backEnd.Write( $"[Id: {CallContext.GetLogicalData( "log-id" )}] {message}" );
}

你好,Haukinger,在我的例子中,使用callcontext可能并不理想,因为我不希望在函数调用中使用任何日志逻辑(如设置callcontext),我希望ICallHandler是自包含的。那么,您希望如何识别应该触发新id的函数?MethodA如何知道它必须设置一个新id(虽然它是从MethodC调用的),但MethodB不应该(因为它是由MethodA调用的)?我可以向属性添加一些属性,让调用处理程序知道何时创建新id,但问题仍然存在。如果从方法内部设置调用上下文,它是否有效?