2014/7/30

[ASP.NET] Server Exception Log 速成

在各式網站中採用了一些 Log 套件之後, 我覺得其實有時候我們不一定需要那麼多複雜的功能, 或許我們只需要偶爾攔截並記錄一些例外錯誤而已。這時候, 我會推薦大家使用最簡單的方法, 也就是把網站中出現的所有例外情況都記在 Server 的 Event Log 裡面

要達成這個目的, 有很多方法可以採用。但是我認為最簡單的方法, 就是在 Global.asax 中覆寫 Application_Error 事件處理常式以記錄應用程式層級的例外狀況:

using System.Diagnostics;
...
string errFormat = 
    "於 Application_Error 事件中捕捉到系統錯誤!\n網址: {0}\n錯誤訊息: {1}\nInner Exception: {2}\n" +
    "Inner Exception Source: {3}\nStack Trace:{4}";

protected void Application_Error(object sender, EventArgs e)
{
    Exception exp = Server.GetLastError().GetBaseException();
    Exception innerExp = exp.InnerException;
    string err = string.Format(errFormat,                
        Request.Url,
        exp.Message,
        exp.InnerException == null ? string.Empty : exp.InnerException.Message,
        exp.InnerException == null ? string.Empty : exp.InnerException.Source,
        exp.StackTrace);
    EventLog.WriteEntry("MyWebApp", err, EventLogEntryType.Error);
    Server.ClearError();
} 

如此一來, 即使我們把網站布署到遠端伺服器上面, 我們想要看到的錯誤訊息也會被記錄到它的 Event Log 上面, 如下圖:

在這裡最重要的是我們可以捕捉到 InnerException 資訊 (如果有); 在許多時候這項資訊對於除錯相當重要。有了這個資訊, 在某種情況下, 可以省去我們許多猜測和實驗的工夫。例如, 我們可以藉此看到網站發行之後才發生的例外錯誤 (像在使用 Entity Framework 時, 這類錯誤很難除錯), 讓我們可以方便地查到發生錯誤的原因。

參考:

How to create custom error reporting pages in ASP.NET by using Visual C# .NET

ASP.NET 網頁和應用程式中的錯誤處理

Rich Custom Error Handling with ASP.NET

沒有留言:

張貼留言