2012-12-15 78 views
11

有沒有辦法配置NLog自動記錄我的應用程序可以發送的所有異常?目前,我正在嘗試所有TRY/CATCH塊,並在CATCH中手動添加日誌記錄 - 但如果我錯過了某些內容,該怎麼辦?而如果將來有人做什麼NLog配置爲自動記錄所有異常?

有沒有辦法告訴NLog總是記錄所有異常?尤其是有些沒有被捕獲並可能導致彈出?

回答

15

據我所知,沒有辦法confineNLog記錄所有異常。

如果您只想記錄未處理的異常,則可以在初始化應用程序時向AppDomain添加「UnhandledException Handler」。 請注意,在某些情況下,可能無法記錄錯誤(例如出現OutOfMemory異常或可怕的情況)。

注意,AppDomain中也有一個FirstChanceException事件,您可以訂閱,但是這將意味着你收到通知每個異常發生(可能由用戶代碼來處理) - 在這個有很多。

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(AppDomain_CurrentDomain_UnhandledException); 

static void AppDomain_CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    // use logger here to log the events exception object 
    // before the application quits 
} 

注意,這樣只會讓你的日誌會導致應用程序崩潰的例外 - 你不能阻止它崩潰(所以名稱:未處理的異常)。

另一種選擇是使用面向方面編程(AOP) - 並在每次方法調用後引入一個日誌記錄方面,以防出現錯誤。如果您的應用程序使用分層架構,這可能相對容易(例如,將方面添加到您的業務邏輯層的所有調用中...)。

你可能會發現像PostSharpSpring.Net框架有用(通常他們的網站提供了一些簡單的例子)。

+0

這是什麼的AppDomain的範圍是什麼?它會在我的項目中捕獲所有未處理的異常還是僅捕獲每個類?另外,我也參考了一些DLL,那些異常呢?我是否需要將此代碼添加到每個DLL(這是他們自己的項目)? – JSchwartz

+1

Appdomain是一個.net概念,用於爲應用程序定義一個獨立的邊界。如果您創建一個控制檯應用程序,它將在一個AppDomain中執行。所有必需的程序集也將加載到相同的AppDomain中。如果在你的應用程序中發生了什麼(無論在什麼程序集中),它將發生在同一個appdomain中。通常,只在應用程序的開始處(例如,在應用程序的Main方法中,或者在application_start方法中的global.asax中存在WebApp的情況下)將示例代碼放置一次。請參閱http://msdn.microsoft.com/en-us/library/system.appdomain.aspx –

0

對於的WebAPI應用程序,你可以做到這一點在Global.asax.cs

protected void Application_Error() 
{ 
    Exception lastException = Server.GetLastError(); 
    NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); 
    logger.Fatal(lastException); 
} 

MSDN resource