2012-12-17 33 views
2

我正在嘗試構建(用於學習目的)我自己的事件記錄器;我對使用非.NET框架而不是構建自己的框架感興趣,因爲我正在通過這樣做來更好地理解.net。C#自定義記錄器 - 捕獲發送對象的最佳方式

這個想法是有一個事件系統,我可以寫出來的日誌文件和/或從程序內部拉。爲此,我創建了一個LogEvent類,該類將存儲在Queue<LogEvent>的內部。

我打算在我LogEvent類使用以下字段:

private EventLogEntryType _eventType //enum: error, info, warning... 
private string _eventMessage 
private Exception _exception 
private DateTime _eventTime 

什麼我不知道是捕獲導致被稱爲該事件的對象的最佳方式。我想過只是做一個private Object _eventObject;,但我認爲這不是線程安全或不安全。

有關如何最好地存儲調用該事件的對象的任何建議,將不勝感激。我也願意接受你可能提出的其他建議。

謝謝,託尼

+0

我也想提及_eventMessage或_exception中需要;兩者都可以添加,但只需要一個。 –

+3

你想要存儲調用該事件的對象的原因是什麼?如果你要簡單地在對象上使用'.ToString()'來創建日誌消息,那麼最好存儲'.ToString()'值。 – Jastill

+0

@Jastill我第二,特別是在例外的情況下。我會採取異常.ToString()並做一個遞歸附加與內部例外。你的EventLogEntryType會讓你知道它是否是一個異常。 – Khan

回答

2

首先,沒有錯,寫你自己的。我們在那裏有一些很好的框架,但有時你達到了一些奇怪的要求讓你滾動自己,我一直在那裏...
我不認爲你應該使用短信。在做過這種類型的日誌記錄之後,我得出結論:最好的方法是有一組事件類型(整數ID)和某種類型的額外信息字段。 你應該有LogEvetTypes枚舉,看起來是這樣的:

public enum LogEventTypes 
{ 
    //1xxx WS Errors 
    ThisOrThatWebServiceError = 1001, 

    //2xxx DB access error 


    //etc... 
} 

這一點,從試圖利用你記錄的信息時,我的經驗將讓你的生活變得更輕鬆。您還可以添加ExtraInformation字段以提供事件實例特定信息。

至於導致事件的對象,我只會用typeof(YourClass).ToString();之類的東西。如果這是您創建的自定義類,則還可以實現一個ToString重寫,它將在您的日誌記錄環境中命名。

編輯:我加入一些細節我在評論中寫道,因爲我認爲他們是非常重要的。通過服務方法傳遞不可變的對象通常不是一個好主意。您可能會在循環中重新設置相同的變量(例如),並創建幾乎無法找到的錯誤。此外,我建議現在做一些額外的工作,以便將日誌記錄基礎結構與應用程序的實現細節分離開,因爲稍後執行此操作會造成很大的痛苦。我是從我自己非常痛苦的經歷中說出這些話的。

+2

擴展@ elad-lachmi的'ToString'覆蓋。如果您正在滾動所有自己的類,則可以使用'.LogInfo()'方法創建一個iLogInformation接口。 – Jastill

+0

@Jastill - 這是真的,但不是我的項目中的一個選項。如果你從頭開始構建所有的對象,你肯定可以讓它們都實現一些日誌接口的王。 –

+0

我喜歡使用.LogInfo()的想法 - 但我可能也希望將其用於其他項目或不包含該代碼的對象。我的想法是使用Try/Catch語句,有沒有更好的方法? –

相關問題