Enterprise Library 2.0 技巧(3):記錄ASP.NET站點中未處理的異常
這篇文章不能算是Enterprise Library 2.0的一個技巧,只是Logging Application Block的一個簡單應用而已,在這里我們使用Logging Application Block來記錄一個ASP.NET 2.0站點中未處理的異常到數據庫中,當然你也可以記錄到文本文件中,或者發送到指定的Email中,下面看一下具體的實現步驟。
1.創建數據庫表和存儲過程
在安裝目錄的src\Logging\TraceListeners\Database\Scripts文件夾下,執行CreateLoggingDb.cmd,注意在這之前要先把LoggingDatabase.sql另存為Unicode格式(參見技巧2)。安裝完成后將會創建一個Logging的數據庫,其中會有三張數據表和四個相關的存儲過程。
2.新建Web站點并進行配置
新建一個Web站點后,添加Web.config文件,并用EntLibConfig.exe打開,新建Logging Application Block后,再新建Database Trace Listener:
設置Database Trace Listener的各項參數,包括存儲過程名,同時還依賴于DAAB:
3.捕獲并記錄ASP.NET異常
首先需要添加如下引用:
Microsoft.Practices.EnterpriseLibrary.Logging.dll
Microsoft.Practices.EnterpriseLibrary.Logging.Database.dll
Microsoft.Practices.EnterpriseLibrary.Data.dll為Web站點添加Global.asax文件,并且在Application_Error編寫如下代碼,這樣在有異常發生時應用程序塊會把異常信息記錄到數據庫中:
<%@ Application Language="C#" %>
<%@ Import Namespace="Microsoft.Practices.EnterpriseLibrary.Logging" %>
<script runat="server">
void Application_Error(object sender, EventArgs e)
{
// Code that runs when an unhandled error occurs
Exception ex = Server.GetLastError().GetBaseException();
LogEntry log = new LogEntry();
log.Message = ex.Message +
"\r\nSOURCE: " + ex.Source +
"\r\nFORM: " + Request.Form.ToString() +
"\r\nQUERYSTRING: " + Request.QueryString.ToString() +
"\r\nTARGETSITE: " + ex.TargetSite +
"\r\nSTACKTRACE: " + ex.StackTrace;
Logger.Write(log);
}
</script>
在Default.aspx.cs的Page_Load事件中制造一個異常信息
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
int error = Int32.Parse("bbbbb");
}
}
運行程序后,可以看到數據庫表中會多出一條記錄:
其中Message的內容:
Input string was not in a correct format.
SOURCE: mscorlib
FORM: 
QUERYSTRING: 
TARGETSITE: Void StringToNumber(System.String, System.Globalization.NumberStyles, NumberBuffer ByRef, System.Globalization.NumberFormatInfo, Boolean)
STACKTRACE: at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
at System.Int32.Parse(String s)
at _Default.Page_Load(Object sender, EventArgs e) in c:\Inetpub\wwwroot\EntLibDemo2\Default.aspx.cs:line 15
at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
at System.Web.UI.Control.OnLoad(EventArgs e)
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)這樣我們就實現了用Logging Application Block對未處理異常信息的記錄,如果要記錄到文本文件或者發送Email,只需要在第2步新建Flat File Trace Listener或者Email Trace Listener,使用文本文件時要注意設置文件夾的權限。
參考http://davidhayden.com/blog/dave/archive/2006/02/15/2802.aspx
Worktile,新一代簡單好用、體驗極致的團隊協同、項目管理工具,讓你和你的團隊隨時隨地一起工作。完全免費,現在就去了解一下吧。
https://worktile.com

浙公網安備 33010602011771號