如何获取在 .net 中发送跟踪日志的方法和类的名称

本文关键字:日志 跟踪 方法 何获取 获取 net | 更新日期: 2023-09-27 18:35:49

我编写了自己的自定义跟踪侦听器,现在我正在使用 TraceSource 对象来调用我从基类 TraceListener 的虚拟方法中覆盖的所有自定义方法,即 TraceData(..)、TraceEvent(..) 和 TraceTransfer(..) 等的各种重载。

在使用 TraceSource 对象

记录跟踪时,我不会直接调用我的任何自定义方法(在我的自定义侦听器上),而是会获取 TraceSource 的实例并调用(在其上)TraceSource 对象自己的方法,如 TraceData(..)、TraceEvent(..) 和 TraceInformation(..),这些方法将在内部调用我的自定义方法。

现在问题是我需要找到跟踪消息或日志来自的类和方法的名称。我正在互联网上搜索,在这里找到了一些东西 如何从代码中获取当前方法的名称

但它仍然没有给我足够的反馈,说明我将如何避免在生产环境中进行编译器优化(正如上面给出的链接所说,在堆栈跟踪中一直需要这些属性,以避免生产中的方法内联和尾递归),但我不能放置诸如

     [MethodImpl(MethodImplOptions.NoInlining)]

在 TraceSource 类的方法上(因为它们已经是我无法控制的开箱即用的内置函数),虽然我可以对我的自定义方法做同样的事情,但只这样做并不能解决我的问题。话虽如此,我面临的另一个问题(属性问题除外)。如何将类的名称(在我的例子中为 XYZ 类)和方法(MyMethod)发送到我的自定义跟踪侦听器方法(因为 MyMethod 不直接调用我的自定义方法,只有 TraceSource 的 TraceData(...) 在内部调用我的自定义方法之一),在我的自定义方法中捕获此信息,然后执行我想对该信息执行的任何操作。

 public class XYZ
 {
     static readonly TraceSource source = new TraceSource("somesource");
     public void MyMethod()
     {  
        source.TraceData(eventType.Error,1, "This is an error message");
     }
}

如何获取在 .net 中发送跟踪日志的方法和类的名称

我认为这里最好的方法是使用代码注入技术注入跟踪方法调用以获取方法的详细信息并记录它。我在这篇文章中解释了这种方法:http://www.codeproject.com/Articles/445858/Tracing-with-Code-Injection

想法是不要尝试在运行时获取当前调用的方法信息,而是在方法主体的开头注入代码以调用 TraceSource 上的日志记录方法并传递方法详细信息。希望有帮助。