2010-03-29 18 views
5

我開始使用Log4Net作爲日誌記錄組件登錄WPF桌面應用程序。這是我的問題:在一個簡單的桌面應用程序中,是否有任何理由不將實例化我的記錄器作爲應用程序類(App.xaml.cs)的屬性,像這樣?Log4Net在App對象中?

public partial class App : Application 
{ 
     private static readonly ILog p_Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 

     public ILog Logger 
     { 
      get { return p_Logger; } 
     } 

     #endregion 
    } 
} 

,讓我來調用記錄

回答

7

一個原因彈簧記:自從App類的靜態構造函數是會跑,你會之前實例化ILog實例代碼的第一位你已經配置了log4net。因此,您的ILog實例將不可用。一般來說,你會做這樣的事情:

public partial class App : Application 
{ 
    private static ILog log; 

    static App() 
    { 
     XmlConfigurator.Configure(); 
     log = LogManager.GetLogger(typeof(App)); 
    } 
} 

順便說一句,那MethodBase業務真的讓我畏縮。爲什麼不使用typeof(App)?你不應該複製/粘貼代碼,未經覈實,反正......和typeof(App)會工作得很好與重構工具...

2

我沒有找到一個理由不要在App對象使用全局記錄器。它可以正常工作,但是從每個使用它的類中獲取一個記錄器是有好處的 - 它使我的日誌消息更短,更容易編寫。

所以我在每個將要記錄的類中調用GetLogger(),並指定記錄器使用的名稱。舉例來說,在我的OpenFile方法,我能得到這樣的記錄:

// Get logger 
var logger = LogManager.GetLogger("OpenFile"); 

這減輕了我在我寫的每一個錯誤信息輸入類名。我仍然在App()構造函數中配置log4net,因爲只需要執行一次。這讓我看起來像這樣的日誌消息:

2010-03-29 15:51:41,951 OpenFile [DEBUG]- Data file opened. 

肯特的答案仍然是公認的答案,但我想我會沿着我所學過。

+1

+1分享您自己的發現。 – 2010-07-22 21:37:13

3

幾個案例針對使用一個全局實例。通過使用每個類的記錄器,您可以獲得:

  • 記錄器層次結構自動跟隨您的類結構的好處。
  • 較小的耦合(您的類不再依賴於App類)。
+0

我的好點數+1 – 2010-03-30 12:15:36

相關問題