在各式網站中採用了一些 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
沒有留言:
張貼留言