2011-02-15 126 views
2

我有一個WinForms應用程序,我需要記錄所有異常(到文件,到web服務,無論),處理和未處理。我怎樣才能做到這一點?應用程序日誌

回答

8

在.NET世界上最常用的日誌框架是log4net的。

但是也有一些需要log4net的在應用程序中集成兩個步驟:

  1. 配置log4.net。例如,在log4net Config Examples頁面上檢出FileAppender。
  2. 準備你的類使用log4net的:

每個類應包含用於記錄的字段:

private static ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 

現在,每當你將不得不處理異常,你會做以下:

try 
{ 
    // Do stuff here 
} 
catch (Exception ex) 
{ 
    _logger.Error("Operation failed.", ex); 
} 

這樣你只解決了問題的一半:處理的異常

爲了捕獲所有未處理的異常在Windows窗體應用程序,你必須處理由.NET Framework提供2個事件:

/// <summary> 
/// The main entry point for the application. 
/// </summary> 
[STAThread] 
static void Main() 
{ 
    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 

    Application.ThreadException += Application_ThreadException; 
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 

    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new Form1()); 
} 

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    _logger.Error("Unhandled exception.", (Exception)e.ExceptionObject); 
} 

static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) 
{ 
    _logger.Error("Unhandled application exception.", e.Exception); 
} 

這all.Nice和容易!

當您開始將應用程序交付給一個或多個客戶時,情況變得複雜。這是因爲您需要請您的客戶爲您提供日誌文件以檢查應用程序是否遇到任何問題。

因此,必須要解決兩個問題:

  1. 如何當一些錯誤發生在您的應用程序得到通知?
  2. 如何獲取有關異常,環境等的詳細信息?

一種解決這兩個問題是使用專用的服務,集中在一個單一的地方所有的異常,並通知您時,您的應用程序遇到任何異常。


有幾種服務試圖解決所有這些問題,其中之一是ExceptionTail
ExceptionTail的一個非常不錯的功能是它可以通過custom log4net appender與使用log4.net的現有應用程序無縫集成。
這意味着您無需重新編譯整個應用程序即可使用該服務。只需在應用程序的文件夾中放入一些dll文件,在應用程序配置文件中添加一些東西,就可以開始使用了。

+1

這是一個很好的答案,我也建議使用Log4Net,但我會用自定義Logging類將調用包裝到ILog對象中,以防萬一以後日誌引擎改變時,一個地方要更新,所有使用包裝類的類都可以。 – 2011-07-03 12:31:59