2013-02-13 42 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

相關問題