2013-02-13 34 views
22

我目前正在使用内置的TraceListener开发应用程序日志库。这个库将被用在许多项目中,并且应该提供一个简单的接口,我只需要关心将要写入日志文件的内容,而不是如何操作。如何确定调用方法和类名?

通过使用反射命名空间,我可以找出哪个应用程序当前称为日志功能(检索执行程序集名称),但我也想要调用日志功能的函数和类的名称。

比方说,我有:

public static void LogInfo(string vLogText) { 
    Trace.WriteLine(
     MethodInfo.GetCurrentMethod().Name 
     + this.GetType().ToString() + vLogText); 
    } 

当我从另一个项目调用(类:识别TestClass,方法:TestMethod的)

Tracer.LogInfo("log this!") 

我希望在日志中看到:

TestClass, TestMethod, log this! 

但是,我得到了

TracerClass, LogInfo, log this! 

如何获得父级方法和类名?

+5

如果您使用最新的C#和VS 2012,[这可能会帮助您很大](http://msdn.microsoft.com/zh-cn/library/hh534540.aspx)。 – 2013-02-13 08:34:25

+0

@ Trustme -I'maDoctor This太棒了!没有意识到这样的事情。你可以请这个答案而不是评论,所以我可以投票并将其标记为已关闭?非常感谢你。 – Neurodefekt 2013-02-13 08:38:30

+0

@Neurodefekt没问题,它完成了。很高兴我能帮上忙。 :) – 2013-02-13 08:41:54

回答

27

最新的C#和VS 2012与Caller Information(即CallerFilePathAttribute,CallerLineNumberAttributeCallerMemberNameAttribute)一起发货,如果您只能使用它,它将对您有所帮助。

如果你不能,你必须参考其他答案。

+1

这对我来说似乎是一个很好的答案,我总是毫不犹豫地为此目的访问stackTrace。一个问题,虽然它看起来像预编译处理器,并将被替换为IL代码中的实际调用者名称。所以我一直在想,如果有人更喜欢混淆IL代码,我就不会安全。对此有何评论? – 2014-04-02 12:08:55

+1

@MubasharAhmad从[documentation](https://msdn.microsoft.com/en-us/library/mt653988.aspx):“调用者信息值在编译时以文字形式发送到中间语言(IL)中。对于异常的StackTrace属性的结果,结果不会受到混淆。“ – 2016-05-13 14:13:48

16

试着做这样的事情:

var mth = new StackTrace().GetFrame(1).GetMethod(); 
var cls = mth.ReflectedType.Name; 
// where 1 illustrates how deep into the stack to reflect. 

这在C#5.0更优雅的解决方案>,但是如果你正在使用旧的框架,上面会有所帮助。

+13

两件事情:1)这可以显着影响性能2)在优化的代码中,方法内联可能会导致打印不正确的方法名称。 – 2013-02-13 08:40:03

2

您可能只记录完整的堆栈轨迹,而不是使用Environment.StackTrace的调用方法。如果您想使用相同的日志记录结构来记录异常,这可能会对您有所帮助。

有关更多信息,请参阅this msdn page

相关问题