2012-05-28 19 views
1

我有一個日誌庫,它提供了一個GUI,允許最終用戶在每個類的基礎上啓用/禁用日誌記錄。這允許支持人員讓最終用戶在解決問題時啓用對感興趣的類的日誌記錄,而不會將日誌與我們不關心的垃圾混淆在一起(這裏有更多內容,但它應該足以解決此問題) 。 GUI必須列出所有使用日誌記錄庫的類。.NET庫能在運行時識別調用類嗎?

我已經在過去使用的方法(在Win32的應用程序)是提供一個寄存器功能該庫的用戶會打電話要列出使用該庫中的類。這有效,但是很痛苦且容易出錯。鑑於我現在在使用.NET,我希望能夠在運行時自己獲得這些類的列表,所以我可以在不需要註冊的情況下填充GUI。

有沒有辦法做到這一點?

+3

你可以使用'Assembly.GetTypes'方法? http://msdn.microsoft.com/en-us/library/system.reflection.assembly.gettypes.aspx也許用戶可以用屬性指示它應該被記錄的類來裝飾類?我不確定你的設計是如何區分類的。 –

+3

檢查日誌並提取已發出日誌消息的類的不同列表不是更好嗎?日誌框架本身是否真的需要識別和停止通過特定類的日誌消息,還是前端只需要應用過濾器? – MattDavey

+0

我同意@MattDavey關於什麼是我的首選aproach,除了它更簡單之外,至少在沒有問題的時候,日誌會在那裏,而且你不需要等待它再次發生。但是,如果我必須像Chris Sinclair那樣做,我會使用一個屬性來創建可記錄日誌,然後使用配置文件來確定要記錄哪些可記錄事件。 –

回答

0

您可以創建一個新的StackTrace(這不只是對異常報告),但它是不是很迅速...

+3

它不僅速度慢,而且在優化的發行版環境中也不可靠。 –

+0

@ AvnerShahar-Kashtan:爲什麼它不可靠?是的,你的行號和參數名稱可能會改變,是你自己程序集中的某些方法可能被內聯......但是從外部來源調用的方法仍然可以讓你從堆棧信息中獲取調用者。 – Ian

+0

就是這樣。我已經看到了獲取'StackTrace'的代碼,並跳回* x *幀來查看是誰調用它,而不考慮內聯和優化。 –

0

是的,你可以使用reflection。下面的代碼來列出當前加載的所有類(和結構):

foreach(Assembly asm in AppDomain.CurrentDomain.GetAssemblies() 
    foreach(Type type in asm.GetTypes()){ 

    } 
} 

AppDomain.CurrentDomain.GetAssemblies()將列出所有在該應用領域中加載的組件,然後使用GetTypes()列出所有的類和結構使得組件contiains的。

0

4.5 - 簡單。將所需的信息作爲參數添加到被調用的方法中,對它們進行註釋,編譯器完成剩下的工作。

http://www.wintellect.com/cs/blogs/jgarland/archive/2012/03/05/using-the-new-callerinfo-attributes-for-reliable-property-change-notifications.aspx有更多的信息。

看起來像這樣:私人無效OnPropertyChanged([CallerMemberName]字符串呼叫者= NULL)

可悲類名)SO,出於運氣也有。

否則 - 沒有快速可靠的方法,對不起。

啓用/禁用逐個類別的日誌記錄。

我所做的是有一個通用記錄器FOR類(記錄器)。這是開放的錯誤,但它也允許我手動記錄其他類的東西 - 例如輔助方法。關於它和QUITE標準一樣好(nlog有類似的機制)。

1

當我們登錄,每個要登錄類創建其類型記錄器的靜態實例。通過這種方法,您可以跟蹤創建的每個實例,並允許用戶根據需要禁用日誌。

private static readonly ILog LOG = LogManager.GetLog(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

然而,這自然也不會被解僱,直到類的靜態成員被加載(我認爲當類/類型是第一次訪問),所以我想這是合理的,你不會看到一個完整的列出需要記錄的類,直到它們全部被訪問。