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>

4.创建一个未处理的异常

Default.aspx.csPage_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

作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。

posted on 2006-07-06 16:38 TerryLee 阅读(4878) 评论(24)  编辑 收藏 所属分类: Enterprise Library.NET Framework

评论

#1楼  2006-07-06 19:31 U2U      

这样比较方便   回复  引用  查看    

#2楼  2006-07-06 19:32 U2U      

但是要练习的地方还是需要自己写才能有进步的   回复  引用  查看    

#3楼 [楼主] 2006-07-07 08:05 TerryLee      

@U2U

用Logging Application Block来记录确实挺简单的:)   回复  引用  查看    

#4楼  2006-07-07 08:46 Aero      

看看
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/elmah.asp

elmah的logging更easy.   回复  引用  查看    

#5楼 [楼主] 2006-07-07 09:31 TerryLee      

@Aero

谢谢^_^

是一个不错Log插件,但如果系统框架完全使用EL的话,也许Logging Application Block更容易跟其它的Block结合   回复  引用  查看    

#6楼  2006-07-07 13:23 SHY520      

@TerryLee
准备把你写的EL2.0技巧放到 EL2.0系列文章中去,如何?   回复  引用  查看    

#7楼 [楼主] 2006-07-07 13:25 TerryLee      

@SHY520

呵呵,当然没问题:-)   回复  引用  查看    

#8楼  2006-07-07 13:27 SHY520      

@TerryLee
等你写完之后,呵呵   回复  引用  查看    

#9楼  2006-12-05 12:22 wayne[匿名] [未注册用户]

还有一步你忘记告诉初学者,把General下面的Formatted EventLog TraceListener改成Database Trace Listener,再把Logging Errors & Warnings下的Formatted EventLog TraceListener改成Database Trace Listener   回复  引用    

#10楼  2007-01-28 03:29 shiningrise [未注册用户]

还有一步你忘记告诉初学者,把General下面的Formatted EventLog TraceListener改成Database Trace Listener,再把Logging Errors & Warnings下的Formatted EventLog TraceListener改成Database Trace Listener


晕,我自己搞了很久才搞定,怎么就没看到这个,   回复  引用    

#11楼  2007-05-23 08:23 asp.net [未注册用户]

有收获   回复  引用    

#12楼  2008-05-19 17:16 Barcode Scanner [未注册用户]

有趣有趣。謝謝。一個問題又釣出這麼多相關文章,太好了。   回复  引用    

#13楼  2008-05-20 15:33 Label [未注册用户]

事在人為嘛. 不過, 大環境實在變得太快. 今天的標準可以是明日黃花!   回复  引用    

#14楼  2008-05-29 14:16 dfd [未注册用户]

准备把你写的EL2.0技巧放到 EL2.0系列文章中去,如何?   回复  引用    

#15楼  2008-06-02 15:22 dfas [未注册用户]

看看   回复  引用    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-07-06 16:40 编辑过
 
另存  打印
 


导航

公告

  • 网名:TerryLee
  • 本名:李会军
  • 位置:中国北京 Ethos
  • 联系方式:
  • 访问我的个人主页

 MVP配置

 版权声明

  • 本站采用创作共用许可 署名,非商业

绿色通道

IT新闻

统计

与我联系

留言簿(323)

我的标签

随笔分类

随笔档案

个人站点

关注项目

好的网站

我的好友

搜索

积分与排名

阅读排行榜

评论排行榜