`

异常处理和日志追踪

    博客分类:
  • .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章 异常处理和日志追踪

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

    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...

    JSPSmart系统-权限管理与日志记录模块的设计与开发(源代码+论文).rar

    日志记录模块则负责记录系统中的各种操作和事件,以便在出现问题时进行追踪和分析。我们采用了Log4j日志框架,实现了对系统日志的统一管理。通过配置不同的日志级别和输出方式,可以满足不同场景下的日志需求。此外...

    Python中处理unchecked未捕获异常实例

    对于checked exception,我们通常使用try except可以显示解决,对于unchecked 异常,其实也是提供回调或者是钩子来帮助我们处理的,我们可以在钩子里面记录崩溃栈追踪或者发送崩溃数据. 下面代码可以实现python ...

    解析c#在未出现异常情况下查看当前调用堆栈的解决方法

    C#查看堆栈通常是在异常处理中,出现异常之后通过异常的堆栈可以很方便的得到出现这个错误的代码调用路径。这个很有用,是否可以在没有异常出现时使用这种方法排查一些非异常错误呢?答案是肯定的。起因:论坛发帖子...

    后端开发开发技巧总结与入门常用的技巧总结.docx

    日志记录:详尽且有组织地记录日志,方便问题定位和追踪。 测试驱动开发:坚持单元测试、集成测试,保证代码质量。 持续集成/持续部署(CI/CD):构建自动化部署流水线,提高迭代效率。 容器化部署:利用Dock

    Mobile移动开发宝典_第04章 捕获错误,测试与调试

    您还将学习Microsoft .NET Compact Framework运行库生成的各种日志文件,了解如何使用它们对特定的错误进行诊断,了解如何将追踪消息输出到IDE,或将其写入部署后的应用程序活动日志中,这些为人们提供了诊断的工具...

    阿里云java短信验证码源码-tailBasedProcess:阿里云第一届云原生编程挑战赛(分布式统计和过滤的链路追踪)

    阿里云第一届云原生编程挑战赛(分布式统计和过滤的链路追踪) 排名:116/4404 参照赛题方给的Demo思路做的一个extend版本,在正式赛的时候排名50左右,但在最终赛由于换了一组数据并且没有给出运行日志,没有找到错误...

    若依微服务框架视频36-80视频章节

    ├── 43 异常处理配置 ├── 44 请求拦截器配置 ├── 45 InnerAuth注解 ├── 46 Feign项目相关使用 ├── 47 服务监控介绍 ├── 48 服务监控使用 ├── 49 监控端点分类 ├── 40 整合Admin-Ui ├── ...

    spaceTraders:玩太空商人

    spaceTraders 玩太空商人去做核更好的异常处理创建一个常量过滤方法可以处理等于,不等于等-可能在元组中添加第三个元素。一般的跟踪总积分-或至少是权益,因此船上的货物价值也受到限制-出于好奇追踪船数建立测试...

    easy-api:简单的api,基于koa2,mongodb,redis

    环境需求nodejs&gt; = 8.8.1 mongodb Redis特性签名验证,将不合法请求拒之门外 JWT授权验证,退出后令牌自动回收统一类别异常处理自动请求ID,方便请求追踪,支持前端预先调试简单可重用的请求参数校验器记录请求日志,...

    Oracle9i的init.ora参数中文说明

    说明: 与 NLS_TIME_TZ_FORMAT 相似, 其中的一对值指定 TIMESTAMP 数据类型的默认值, 该类型除存储 YEAR, MONTH 和 DAY 日期值, HOUR, MINUTE 和 SECOND 时间值, 还存储 TIMEZONE_HOUR 和 TIMEZONE_MINUTE。...

    深入解析Oracle.DBA入门进阶与诊断案例

    2.4.8 坏块的处理与恢复 97 第3章 参数及参数文件 103 3.1 初始化参数的分类 103 3.1.1 推导参数(Derived Parameters) 103 3.1.2 操作系统依赖参数 104 3.1.3 可变参数 104 3.1.4 初始化参数的获取 ...

    深入解析Windows操作系统中文.part2.rar

    3.7 内核事件追踪 175 3.8 Wow64 178 Wow64进程地址空间布局结构 179 系统调用 179 异常分发 179 用户回调 179 文件系统重定向 180 注册表的重定向和反射 180 I/O控制请求 181 16位安装器应用程序 182 打印 182 一些...

    SVN使用手册中文版快速入门

    为什么日志说通过Apache(ra_dav)提交或导入的文件“(no author)”? 我偶然在Windows得到“Access Denied”错误,它们看起来随即出现。 在FreeBSD,某些操作(特别是svnadmin create)有时会挂起。 我可以在web...

    SVN使用手册中文版.chm

    为什么日志说通过Apache(ra_dav)提交或导入的文件“(no author)”? 我偶然在Windows得到“Access Denied”错误,它们看起来随即出现。 在FreeBSD,某些操作(特别是svnadmin create)有时会挂起。 我可以在web...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

    chapter8 异常处理 231 8.1 语法与继承架构 232 8.1.1 使用try、catch 232 8.1.2 异常继承架构 235 8.1.3 要抓还是要抛 238 8.1.4 认识堆栈追踪 241 8.1.5 关于assert 245 8.2 异常与资源管理 247 ...

    asp.net知识库

    利用委托机制处理.NET中的异常 与正则表达式相关的几个小工具 你真的了解.NET中的String吗? .NET中的方法及其调用(一) 如何判断ArrayList,Hashtable,SortedList 这类对象是否相等 帮助解决网页和JS文件中的中文...

    传智播客扫地僧视频讲义源码

    10_socketclient动态库_日志功能集成 11_项目中检索内存泄漏使用和基本原理 12_动态库基本知识和环境调试注意 13_动态库内存释放问题 源码及文档 01_上一次课程回顾 02_链表热身_结构体中套元素和指针 03_结构体数据...

    Spring Cloud Finchley SR2全套(集成Spring Gateway)

    框架中包含了熔断器聚合监控、链路追踪监控,这里比较常规就不再赘述,唯一遇到的问题就是链路追踪时日志包重复引用的错误如下处理即可 &lt;groupId&gt;io.zipkin.java &lt;artifactId&gt;zipkin-server ${zipkin.version} ...

Global site tag (gtag.js) - Google Analytics