ELMAH(ASP.NET错误日志记录与通知)系列文章-概念篇

2023-10-27 21:58

本文主要是介绍ELMAH(ASP.NET错误日志记录与通知)系列文章-概念篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://www.cnblogs.com/lerit/archive/2011/03/29/1998396.html

 最近在研究几个ASP.NET的开源项目时,发现都在使用ELMAH来作为记录整个应用程序的错误日志,于是拿来小研究了一下,在这里和各位分享一下,如果有使用过的,请多指教。

    对于ELMAH,将用三篇系列文章来介绍:

  •     概念篇
  •     基本应用篇
  •     高级应用篇

   概念篇

    ELMAH(The Error Logging Modules And Handlers),直译过来就是“错误日志模块和处理”,它提供了一个用于集中记录和通知错误日志的机制。它是专用于ASP.NET的完全可热插拔的错误日志记录工具。其特点就是无需ASP.NET程序重新编译,即可通过配置web.config(或machine.config)来实现整个应用程序甚至是IIS中所有ASP.NET应用程序的错误日志记录工作。它支持日志的多种存储方式(各种数据库、XML、内存存储),除了提供一个界面用于查询日志详细信息外,还可以通过E-MAIL、RSS订阅或Twitter发布方式通知错误信息给相关人员。

  error0

    对于一个已经运行于生产环境的ASP.NET程序,如果想用ELMAH为程序增加错误日志记录的功能,只需要将ELMAH的dll文件复制到程序的bin目录下,然后修改此ASP.NET程序的web.config文件,就完成了所有的配置工作。以后,想查看系统发生了哪些错误信息,直接输入在web.config中事先指定的页面地址,即可看到日志信息。具体操作请看下一篇:应用篇。本文将简单介绍其基本概念和运行机制。

1.ELMAH是一个可热插拔的解决方案。也就是说可以动态的加入到ASP.NET应用程序,而不需要对项目进行重新编译和部署,因为仅需要在web.config中配置,并将一些程序集复制到bin目录下即可,而不需要更改项目中其他任何内容(如果你项目中的代码有可能导致ELMAH无法记录一些异常信息,则需要修改相关代码,具体请看下面第4条)。

2.ELMAH仅仅是后台记录未处理的异常,在异常发生时,它并不会改变用户体验,也就是说根据软件自身设置情况,用户依然可能看到黄颜色的报错界面或者被定位到一个错误提示页面。实际上,从用户体验角度,应该制定一个友好的错误页面, 可以参考文章2

3.ELMAH是通过HTTP modules与HTTP handlers来记录和展示软件中未捕获的异常(如果异常通过catch被捕获了就无法记录了,除非捕获后又throw。也就是在异常链上,最终的异常必须抛给了ASP.NET运行时,才可以被捕获)。另外,如果那个未处理的异常是ASP.NET Web service的,因为这种异常不发给HTTP modules,ELMAH也是无法记录到的.这种异常被ASP.NET运行时截获并返回一个SOAP falut(SOAP消息中传输错误及状态信息),因此,如果想记录这种异常,可以创建一个SOAP扩展来监听SOAP faults。

这里简单介绍一下HTTP modules与HTTP handlers:

当一个请求到达IIS,如果这个请求资源被配置为由ASP.NET ISAPI来处理,那么IIS将把这一请求分发给aspnet_isapi.dll,而这个dll将请求又交给了ASP.NET引擎来处理。在这一引擎里,有多个HTTP modules(可以在web.config中配置),每个请求都要依次通过这些HTTP modules,这就使得各个HTTP modules可以根据自己需要处理这些请求,当经过所有的HTTP modules后,将由一个(只能是一个)HTTP handler来处理这一请求(可以在web.config中配置由哪个HTTP handler来处理,它是根据被请求资源的路径名称或者后缀名来决定,比如可以指定如果请求error.axd这个资源文件,则由名称为ErrorLog的HTTP handler来处理。)。处理后这个HTTP handler将结果返回给用户,其过程是上述的相反过程,通过各个HTTP modules,最终到达用户端,示意图如下:

IC121205 

下面来看看ELMAH是如果根据如上的机制,来配置httpModules和handlers的。
//ELAMH添加了一个HTTP module,从而让每个请求和回应都通过它。当用户请求一个资源而报错后,返回给这个错误信息时,
//当通过了ErrorLog这个HTTP module,ELMAH获取到回应中的错误信息,并记录下来。
<httpModules>  <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" /> 
</httpModules>   //当用户想查看记录下来的错误日志时,他将请求叫做elmah.axd的资源文件,这个请求最终被叫做Elmah的这个handler来
//处理,他查询错误日志的信息后,将结果返回给用户,从而实现了查询功能。
<handlers> <add name="Elmah" verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah"/>
</handlers>

4.ELMAH捕获异常是基于HttpApplication对象的Error事件。如果软件项目中的一些处理导致了HttpApplication事件无法被触发(比如在发生异常后,还没来得及执行Application_Error,就执行了Server.ClearError()方法,他会阻止Error事件的触发,再比如,如果一个异常被try-catch捕获到,并且没有再次throw,那么异常也是不会最终触发Error事件),那ELMAH也就无能为力了。因此要确保这一点。

5.既然可以通过配置某一项目的web.config文件并将DLL文件Copy到项目的bin目录下即可实现对某一项目的错误日志记录,那么同样可以通过配置machine.config以及将dll文件置于GAC中,从而实现对IIS中所有ASP.NET项目实现错误日志记录。

6.还有一个常用的用于.NET异常处理的解决方案:Exception Management Application Block (EMAB)。他是Enterprise Library的一个模块。这里并不主要讨论它与ELMAH谁更好,只有哪个更适合某一应用,以下简单对比:

(1):ELMAH的机制决定他只用于ASP.NET,而EMAB同时适用于.NET的WinForm和ASP.NET,但是更适合用于WinForm,因为默认它将日志记录于操作系统的事件查看器,事件查看器适用于记录精简的日志信息,而这对于ASP.NET,如果是运行于共享主机等空间,还需要分配给ASP.NET读写事件查看器的权限,这显然有时候并不可行。当然,EMAB也可定制其他记录日志的方式,但这一切都需要开发人员去实现。

(2):EMAB不是热插拔的解决方案,需要在Global.asax的Application_Error中(或其它位置)编写相应代码。而ELMAH是热插拔的,不需要编写代码,不需要重新编译软件。

7.其实.NET下的日志记录工具还是不少的,比如著名的Log4net以及Enterprise Library中的Logging Application Block。可以说,这些工具相对ELMAH来说,太重量级了,他们可以记录各种日志信息,比如监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作;跟踪代码运行时轨迹,作为日后审计的依据;担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息。因此,如果仅仅是记录ASP.NET的错误日志,ELMAH应该是首选,而其他功能,ELMAH就无能力为了,也就是说,没有所谓好坏,只有哪个更适合之说吧。

基本概念就这样吧,要想深入理解其运行机制,可以参考下面的参考文章1,讲的很详细。

备注:感谢周公帮我指出了一个笔误,不知道你会不会解梦啊:)

参考文章:
1.《Using HTTP Modules and Handlers to Create Pluggable ASP.NET Components》

2.《customErrors Element (ASP.NET Settings Schema)》

3.《ASP.NET中的HTTP模块和处理程序》

4. ELMAH主页

5.《ELMAH的web.config详细配置(v1.1)》


这篇关于ELMAH(ASP.NET错误日志记录与通知)系列文章-概念篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/288666

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

2、PF-Net点云补全

2、PF-Net 点云补全 PF-Net论文链接:PF-Net PF-Net (Point Fractal Network for 3D Point Cloud Completion)是一种专门为三维点云补全设计的深度学习模型。点云补全实际上和图片补全是一个逻辑,都是采用GAN模型的思想来进行补全,在图片补全中,将部分像素点删除并且标记,然后卷积特征提取预测、判别器判别,来训练模型,生成的像

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

我在移动打工的日志

客户:给我搞一下录音 我:不会。不在服务范围。 客户:是不想吧 我:笑嘻嘻(气笑) 客户:小姑娘明明会,却欺负老人 我:笑嘻嘻 客户:那我交话费 我:手机号 客户:给我搞录音 我:不会。不懂。没搞过。 客户:那我交话费 我:手机号。这是电信的啊!!我这是中国移动!! 客户:我不管,我要充话费,充话费是你们的 我:可是这是移动!!中国移动!! 客户:我这是手机号 我:那又如何,这是移动!你是电信!!

【VUE】跨域问题的概念,以及解决方法。

目录 1.跨域概念 2.解决方法 2.1 配置网络请求代理 2.2 使用@CrossOrigin 注解 2.3 通过配置文件实现跨域 2.4 添加 CorsWebFilter 来解决跨域问题 1.跨域概念 跨域问题是由于浏览器实施了同源策略,该策略要求请求的域名、协议和端口必须与提供资源的服务相同。如果不相同,则需要服务器显式地允许这种跨域请求。一般在springbo