`

异常处理和日志追踪

    博客分类:
  • .NET
阅读更多

 

关于异常的处理想必大家都了解try{}catch(){}finally{},这里就不再讲了。通过在VS里的"调试"-"异常",在弹出的异常对话框里的Common Language Runtime Exceptions栏里是.NET中的异常层次结构。

自定义异常:

如果系统提供的异常类已经不能够满足应用系统开发的需要,或者开发团队需要一套自定义异常处理机制,可以创建自定义的异常类。自定义异常类应该直接过间接地继承自ApplicationException类,并且其最好有良好的命名:错误的描述性名称+Exception,应该定义3个构造函数:默认构造函数,接受错误消息的构造函数,接受错误消息和内部异常对象的构造函数。CLR抛出的异常都继承自SystemException,应用程序抛出的异常应当继承自ApplicationException。这样一来,开发人员就能够编写catch块来捕获所有CLR抛出的异常或所有应用程序抛出的异常。

anderslly推荐  shineqiujuan

记录异常:

Web应用程序的用户可能成千上万,有时除了向用户显示错误信息外可能还需要将异常记录下来,比如web服务器负载过重,一些问题间歇性地多次出现等。.NET框架提供了多种记日志工具,比如可以在错误产生时发送E-mail,添加到数据库记录或读写文件中。一个较好的处理方式是使用windows事件,windows事件程序是windows系统内置的用于记录系统或应用程序日志的一个工具,可以被任何应用程序使用。

控制面板里的管理工具里打开事件查看器来查看windows事件日志。一般事件分类有应用程序(用于记录任何应用程序的错误或通知,通常可以在这里记录ASP.NET应用程序异常)系统(用于记录跟操作系统相关的事件)安全(用于记录安全相关的问题,仅由操作系统使用)。在这些事件分类里单击某个事件将弹出该事件的详细信息窗口。右击这些事件分类后可以清除日志,另存日志,新建日志查看,从文件打开,通过属性可以设置日志文件的大小上限等。如果日志大小超过指定上限,则自动清除过期的事件日志。

将异常写入windows事件日志

System.Diagnostics命名空间下的EventLog类可以读写事件日志

  protected void Button1_Click(object sender, EventArgs e)

        {

            try

            {

                int a = 1; int b = 0;

                int c = a / b;

            }

            catch (Exception ex)

            {

                Label1.Text = "<b>错误消息:</b>"+ ex.Message + "<br/>";  错误的描述信息

                Label1.Text += "<b>错误源:</b>" + ex.Source + "<br/>";     返回哪个程序集出错了

                Label1.Text += "<b>堆栈追踪:</b>" + ex.StackTrace;          

                Label1.ForeColor = System.Drawing.Color.Red;

     判断windows事件日志里有没有该类事件,我们可以在事件日志看到每个事件都有一个事件ID,事件ID相同的事件就属于同一类事件

                if (!EventLog.SourceExists("除法运算错误"))

                {

     如果不存在该类事件就注册该类事件,并且将该类事件注册在我们自定义的事件分类里,第二个参数默认为应用程序

                    EventLog.CreateEventSource("除法运算错误", "ASPNET事件日志");

                }

     EventLog类的构造函数可以打开指定的事件分类(相当于某个表)

                EventLog elog = new EventLog("ASPNET事件日志");

     指定事件来源字符串,该字符串将出现在事件分类的来源栏(相当于来源字段)里

                elog.Source = "来自web服务器";

     将一个事件项写入指定事件分类里,这里指定了事件描述,事件类型,还可以指定事件ID等(相当于一条记录)

                elog.WriteEntry(ex.Message, EventLogEntryType.Error);

            }

        }

可以看出windows事件日志就像一个数据库,事件分类就是不同的表,里面的事件项就是记录

 

编程查看事件日志(相当于查看数据库中某个表的所有记录)

复杂的,指定了显示的字段

首先创建一个事件项实体类

   public class EventItem

        {

            public string EventType{get;set;}           事件类型

            public string EventMessage{get;set;}    事件描述

            public DateTime EventTime{get;set;}     事件发生时间

            public string EventSource{get;set;}       事件来源

            public EventItem(string eventtype,string eventmessage,DateTime eventtime,string eventsource)

            {

                EventType = eventtype;

                EventMessage = eventmessage;

                EventTime = eventtime;

                EventSource = eventsource;

            }

        }

然后创建一个列表类用于保存某个事件分类里的所有事件项

  public class EventList : List<EventItem>

        {

            public EventList(string logname)

            {

                if (!EventLog.Exists(logname)) 判断是否有该事件分类(是否有该表)

                {

                    return;

                }

                else

                {

                    EventLog elog = new EventLog(logname);  打开某事件分类

  foreach (EventLogEntry item in elog.Entries)  事件项是EventLogEntry类型,Entries属性可获取该事件分类里的所有事件项

                    {

   EventItem eventitem = new EventItem(item.EntryType.ToString(), item.Message, item.TimeGenerated, item.Source);

                        this.Add(eventitem);

                    }

                }

            }

        }

  protected void Button1_Click(object sender, EventArgs e)

        {

            string logname = TextBox1.Text;

            EventList eventlist = new EventList(logname);

            GridView1.DataSource = eventlist;

        }

简单的,获取的事件项包含默认字段

 protected void Button1_Click(object sender, EventArgs e)

        {

            string logname = TextBox1.Text;

            EventLog elog = new EventLog(logname);

            GridView1.DataSource = elog.Entries;  Entries属性返回集合类型是EntryCollection,其继承了IEnumerable,可以绑定

            GridView1.DataBind();

        }

 

利用log4net来记录日志

 

http://blog.csdn.net/zhoufoxcn/archive/2010/11/23/6029021.aspx|推荐

http://www.cnblogs.com/dragon/archive/2005/03/24/124254.aspx|推荐

http://www.cnblogs.com/xugang/archive/2008/04/09/1145384.html

http://blog.csdn.net/zhoufoxcn/archive/2008/03/26/2220533.aspx

http://blog.csdn.net/antyi/archive/2007/04/30/1592812.aspx

下面配置的是每天都产生一个txt日志文件的方式,其他方式在第一个链接里都有描述,第二个链接理论讲的很好

   <log4net>

       <root>

         <appender-ref ref="RollingLogFileAppender_DateFormat" />

       </root>

       <appender name="RollingLogFileAppender_DateFormat" type="log4net.Appender.RollingFileAppender">

         <file value="Log/Dailylog.txt" />

         <appendToFile value="true" />

         <rollingStyle value="Date" />

         <datePattern value="yyyyMMdd" />

         <layout type="log4net.Layout.PatternLayout">

           <conversionPattern value="日期[%date]线程ID[%thread]文件名[%file]行号[%line]%-5当前优先级别[%level]错误描述[%message]" />

         </layout>

       </appender>

     </log4net>

 

页面追踪

尽管ASP.NET的错误页面提供了非常有用的信息,但是有时候开发人员需要更详细的信息来修正应用程序中的错误。比如应用程序执行一个属性或者是追踪应用程序中的逻辑错误。有时候应用程序可能产生了一些无效的数据,但是并没有明显的异常触发。ASP.NET提供了追踪功能,让开发人员使用一种更方便和有弹性的方式来报告诊断信息。

在页面级别启用除了可以在<%@ Page Trace="true"%>设置外,还可以在代码中设置,如:

protected void Page_Load(object sender,EventArgs e)

{Page.Trace.IsEnabled=true;}  

Page对象的Trace属性是System.Web.TraceContext类的实例。使用代码的好处在于可以根据特定的环境来启用和禁止页面追踪功能。

这样运行后ASP.NET追踪提供了大量的诊断信息:

1.请求详细信息(SessionID,请求类型,请求时间,请求的状态码,请求编码,响应编码)

2.跟踪信息(追踪信息显示页面被发送到客户端之前页面的处理流程,并提供了页面执行的详细执行时长)

3.控件树(显示页面上所有runat=server的控件)

4.会话状态和应用程序状态(显示当前应用程序中所有会话状态Session的键,值,类型和所有应用程序状态Application的键,值,类型)

5.请求Cookie集合(web浏览器请求的Cookies的名,值,大小)  响应Cookie集合(web服务器发送的Cookies的名,值,大小)

6.标头集合(列出了所有HTTP头信息(是作为请求的一部分发送到web服务器的一小块信息,包括请求信息,支持的内容类型,使用的语言等))

7.响应标头集合(列出了作为响应发送到客户端的一部分信息)

8.窗体集合(post方式提交的表单信息)    但貌似8,9只是表单中服务器控件的值(ASP.NET页面追踪只追踪服务器控件?)

9.Querystring集合(get方式提交的表单信息/查询字符串中的名称和值)

10.服务器变量(通常不必看)

以上只是针对一个页面使用追踪,可以在根web.config中设置,对整个应用程序启动追踪,在<system.web>下配置:

<system.web>

<trace enabled="true" requestLimit="10" pageOutput="false" traceMode="SortByTime" localOnly="true"/>

</system.web>

requestLimit(最大数量的HTTP请求的追踪信息) traceMode(按什么方式排序) localOnly(追踪信息只显示在本地)

访问这些请求信息时只需访问根目录下的trace.axd(实际不存在)就可以了。

分享到:
评论

相关推荐

    第7章 异常处理和日志追踪

    总结,异常处理和日志追踪是确保ASP.NET应用程序稳定性和用户体验的关键部分。通过适当的异常处理,我们可以捕获和处理运行时错误,避免程序崩溃;日志追踪则帮助我们在问题发生后进行分析和修复;用户友好的错误...

    Android中处理崩溃异常和记录日志

    下面将详细讲解如何在Android中有效地进行异常处理和日志记录。 一、异常处理 1. **全局异常捕获**:在Android应用的主入口点,通常是`Application`类或`Activity`的基类中,可以设置全局异常处理器。通过注册`...

    vb6.0 动态生成控件和异常处理日志

    创建异常处理日志有助于追踪和诊断问题。以下是创建异常处理日志的基本步骤: 1. 开始错误处理:在可能出现错误的代码块前,使用On Error Resume Next开启错误处理。 2. 编写日志记录函数:创建一个函数,用于接收...

    ASP.NET 3.5完全自学手册

    ### ASP.NET 3.5完全自学手册 - 异常处理和日志追踪 #### 7.1 ASP.NET应用程序异常处理 在开发ASP.NET应用程序时,处理异常是非常重要的一个环节。异常处理不仅能够帮助开发者理解程序运行时的问题所在,还能够...

    JAVA_DAO 事务界定 异常处理,日志记录

    ### JAVA DAO 事务界定、异常处理与日志记录 #### 一、引言 在现代软件开发中,尤其是在企业级应用领域,数据访问对象...开发者应该根据实际需求选择合适的事务界定策略,并确保异常处理和日志记录机制的有效实施。

    异常+开源日志

    ### 异常处理与开源日志记录工具log4j #### 异常处理 异常处理是编程中一种重要的机制,用于处理程序运行期间发生的意外情况。在Java中,异常处理主要包括`try`、`catch`、`finally`等关键字。 ##### `try-catch` ...

    ASP.NET+3.5完全自学手册c#电子教案

    第7章 异常处理和日志追踪.ppt 第8章 ASP.NET中的样式,主题和母版页.ppt 第9章 ASP.NET中的站点导航技术.ppt 第10章 用户控件和绘图.ppt 第11章 ASP.NET AJAX开发技术.ppt 第12章 Web部件技术.ppt 第13章 ADO.NET...

    文件监控处理和异常的日志处理

    在IT行业中,文件监控处理和异常日志管理是系统稳定性与可维护性的重要组成部分。本文将深入探讨这两个关键概念,并以“FileWatchDemo”为例,介绍如何实现一个简单的文件监控程序,以及在遇到错误时如何有效地记录...

    reactnative异常处理库

    6. **插件集成**: React Native异常处理库往往可以与其他库(如Crashlytics、Sentry等)集成,这样可以结合这些专业服务进行更全面的错误追踪和分析。 7. **实时调试**: 对于开发阶段,异常处理库还可能提供实时...

    Android异常日志保存

    在Android应用开发中,捕获和处理异常是至关...通过创建自定义的日志保存机制,开发者可以更有效地追踪和解决应用中的错误,从而提高用户体验。理解并实践"DebugDemo"中的示例,能帮助我们更好地理解和运用这一技术。

    spring统一异常与日志管理

    日志记录帮助我们追踪和调试问题,而异常处理则让我们能够更好地控制程序的流程,提供更友好的用户体验。这样的设计提高了代码的可读性和可维护性,减少了重复的代码,是现代Java应用开发的最佳实践之一。

    .NET异常处理最佳实践

    .NET异常处理是软件开发中的关键环节,特别是在.NET框架下,良好的异常处理机制能确保程序的稳定性和健壮性。以下是一些.NET异常处理的最佳实践: 1. **及早检查问题**:在代码执行的早期阶段就检测潜在的问题,...

    记录异常日志工具

    异常日志能够帮助我们追踪、诊断和解决程序运行时遇到的问题,提高软件的稳定性和可靠性。本文将详细讲解如何在C#中利用异常日志工具记录和读取错误日志。 首先,我们需要理解什么是异常。在C#中,异常是一种表示...

    《将异常写入事件日志中(一):将异常写入应用程序的事件日志中》源代码

    本文将深入探讨如何在ASP.NET应用中将异常信息写入事件日志,以方便开发者追踪和调试问题。 首先,我们需要了解事件日志是什么。事件日志是操作系统提供的一种服务,可以记录应用程序、系统和其他服务发生的事件。...

    iOS异常捕获和崩溃日志

    通过Xcode的Organizer或第三方工具(如Crashlytics、Firebase Crash Reporting等),开发者可以方便地查看和管理这些日志,以便追踪和修复错误。 在实际开发中,为了提高用户体验,我们不仅要捕获异常,还要尽可能...

    Android异常日志捕获

    在Android开发过程中,异常日志捕获是至关重要的一个环节,它可以帮助开发者追踪并解决程序运行时出现的问题。本文将详细讲解如何在Android系统中进行异常日志的捕获、记录以及分析,以便优化和调试应用程序。 首先...

    Java 异常处理的误区和经验总结

    然而,许多开发者在实际操作中常常陷入一些常见的异常处理误区,这不仅可能导致程序的错误难以追踪,还可能影响程序性能。以下是对Java异常处理的一些误区和经验总结。 **误区一:过度使用try-catch块** 有些开发者...

    后端异常统一处理解决方案

    在IT行业中,后端异常处理是一项至关重要的任务,它确保了系统的稳定性和用户体验。这篇博客“后端异常统一处理解决方案”主要探讨了如何在Spring Boot、SSM(Spring、Spring MVC、MyBatis)框架中有效地管理和处理...

    springboot全局异常处理

    总的来说,Spring Boot的全局异常处理机制使得我们可以集中管理错误处理,提供一致的错误响应,并且可以方便地进行日志记录和调试。在实际开发中,这是一项非常实用的功能,能够提升系统的稳定性和用户体验。

    asp.net 网站异常日志记录,全局配置即可实现全部错误的记录,可管理查看错误

    在ASP.NET中,异常处理和日志记录是至关重要的部分,它们可以帮助开发者追踪和解决程序运行时的问题,确保系统的稳定性和可靠性。下面我们将深入探讨如何在ASP.NET中实现全局的异常日志记录,以及如何管理和查看这些...

Global site tag (gtag.js) - Google Analytics