常在服务器端处理用户请求时.特别是针对Web应用程序.当出现异常是能够根据日志操做记录还原异常出现时操做步骤.而记录异常堆栈信息判断问题出现问题位置. 为了跟踪和记录服务器行为.特别是针对出现异常时构建简单、统一的异常处理模式就显得尤其重要.html
若是有一个基础的架构用来记录服务器端中日志和事件.那么对于调试和在问题的解决就变得更加简单直接.针对日志记录.可能针对大部分开发人员.首先表现明显就是应用程序底层或是运行时中存在Bug或是特定状况下Crash掉等. 比较明显的行为.这时日志记录目的是为了跟踪应用程序的底层行为.了解出现异常时应用程序内部所执行的过程. 可以帮助开发人员和软件测试找到应用程序崩溃的缘由. 快速解决问题.java
而还有一些状况.是很难再开发阶段把问题暴露出来.相似性能问题.而此时若是有了日志记录服务端行为.则能够经过提供的详细执行时间记录能够很方便的找出应用的性能瓶颈.定位这些比较”隐性“问题.mysql
因此花了点时间研究日志记录组件.说说我的见解.web
在开源日志管理上固然不得不提到是LogStash .sql
它是一个应用程序日志、事件的传输、处理、管理和搜索的平台.基于HTML五、Jquery、Css3和SVG等技术.因此也是跨平台的、跨浏览器的.可应用任何的Asp.net开发.能够用它来统一对应用程序日志进行收集管理.最可贵难得的提供Web接口用户查询和统计. 因此特色是跨平台同时也是足够开放的.[这就是开源社区的力量.]推荐.数据库
另一个就是从Java移植过来的.Net版本Log4Netapache
这个可能给位已经很熟悉了.Log4net是从java平台下很是优秀的日志记录框架Log4J移植到.NEt下版本.它也是Apache基金资助的项目的一部分.Log4net能够帮助咱们把日志信息输出到各类不一样目标(文本文件、数据库、控制台等)的.net类库,它能够容易的加载到开发项目中,实现程序调试和运行的时候的日志信息输出,提供了比.net本身提供的debug类和trace类的功能更多,使用起来也是很是的简单.浏览器
在说道本篇即将提到的Elmah.服务器
Elmah实际上是[The Error Logging Modules and Handlers]缩写.它是专用于ASP.NET的彻底可热插拔的错误日志记录工具。其特色就是无需ASP.NET程序从新编译,便可经过配置web.config(或machine.config)来实现整个应用程序甚至是IIS中全部ASP.NET应用程序的错误日志记录工做。它支持日志的多种存储方式(各类数据库、XML、内存存储),除了提供一个界面用于查询日志详细信息外,还能够经过E-MAIL、RSS订阅或Twitter发布方式通知错误信息给相关人员.架构
分别试用一下.
LogStash最大的特色是除了跨平台自己以外.它最强大的地方是其提供丰富的插件的.各类灵活自定义规则.输出各类各样的日志结果.能够在不一样的服务器上对不一样的数据来源作自定义的filter,而后输出到不一样的目的插件上去.这样对于分布式是采集日志提供很好解决方案.相似要监控A B服务器上日志.能够再C服务器上接受日志记录数据并分析让后分发给D服务器作报警和容错处理. 自由开放.能够任意端采集日志数据.
Log4Net包含了主要有四种重要的组件,分别是Logge, Repository, Appender以及 Layout.功能强大.能够自定义日志输出级别.但我认为对于规模偏小的应用程序.在配置方式和灵活度显得不够Clean.
本篇来尝试Elmah在Asp.net MVC 4使用.
首先Build 空的Asp.net MVC 4 Project:
添加Elmah引用:
若是采用VS2012则如上关于Elmah组建已经配置成功.其实这个过程作了两件事:
A:将Elmah.dll复制到程序的根目录的Bin文件夹下.并当前项目的引用.
B:向项目根目录下Web.Config文件添加以下内容
在webConfig文件中添加以下内容:
1: <configSections>
2: <sectionGroup name="elmah">
3: <section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah" />
4: <section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" />
5: <section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" />
6: <section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah" />
7: </sectionGroup>
8: </configSections>
9:
10: <httpHandlers>
11: <add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
12: </httpHandlers>
13:
14: <httpModules>
15: <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
16: </httpModules>
关于Elmah项目引用配置基本完成.若是你不习惯NuGEt也能够采用如上手工的方式添加项目引用.
此时在homeController中throw 一个nullException :
1: public class HomeController : Controller
2: {
3: public ActionResult Index()
4: {
5: //throw new null exception for test
6: throw new ArgumentNullException();
7: return View();
8: }
9: }
运行效果以下:
很明显.当咱们throw一个异常后.,会出现报错的黄页.在来看看Elmah是否记录本次执行过程当中出现ArgumentNullException.
能够看到Elmah已经如期的扑捉到当前应用程序的异常.ELMAH在后台记录了错误信息,并为咱们提供了查询错误日志信息的界面,只须要简单的操做,就完成了基本的需求.
其实Elmah处理原理.当咱们请求页面报错时.在返回黄页错误时首先被httpModules中名为ErrorLog模块进行拦截. 该模块将本次请求出错的信息保存起来.-默认是放置在内存中.便于即时调试.但用户输入elmah.axd要查看日志信息时. 首先httpHandlers捕获到该请求.并交给专门处理elmah.axd的处理程序.该模块把错误日志View返回给用户.可见Elmah核心技术仍是基于HttpModules和HttpHandlers来实现的.
在添加完对Elmah引用可见在web.config同时添加Elmah节点 以下:
1: <elmah>
2: <!--
3: See http://code.google.com/p/elmah/wiki/SecuringErrorLogPages for
4: more information on remote access and securing ELMAH.
5: -->
6: <security allowRemoteAccess="false" />
7: </elmah>
Elmah经过该节点对外公开功能配置项.该配置选项功能丰富.开篇提到Elmah对存储方式支持包含:
- Microsoft SQL Server
- Oracle (OracleErrorLog)
- SQLite (version 3) database file
- VistaDB (VistaDBErrorLog); 在1.2版,再也不推荐使用
- Microsoft Access (AccessErrorLog)
- SQL Server Compact Edition (1.2支持)
- MySQL (1.2支持)
- PostgreSQL (1.2支持)
首先若是你只是引用Elmah而没有配置采用什么存储形式.Elmah默认设置为内存存储的方式.虽然这种方式便于开发调试.但在部署生产环境后仍是推荐对数据要进行持久化存储. Xml文件或是采用支持的数据库.
改为文件存储方式只须要在配置项添加以下代码便可:
1: <elmah>
2: <!--
3: See http://code.google.com/p/elmah/wiki/SecuringErrorLogPages for
4: more information on remote access and securing ELMAH.
5: -->
6: <security allowRemoteAccess="false" />
7: <errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="~/Static/Log/" />
8: </elmah>
该配置必需确认LogPath路径目录是完整存在的.测试会发如今本地文件中会出现一个XML文件:
这种方式虽然简单直观.但Elmah设计方式在每次运行若是应用程序出错一旦扑捉到.就独立生成一个独立的文件.这种方式会致使服务器端存在大量冗余文件.且对这些文件管理也是一个问题.
在数据可视化和管理上数据库依然是最理想的选择.这里采用SQlServer2008 版本测试.在构建Elmah支持SQLServer数据支持须要以下三个操做:
A: 须要告诉Elmah 须要链接什么类型的数据库
B: Elmah如何链接这些数据库.也就是链接字符串须要提供
C: 在指定数据库中已经存在对应存储Log日志表和视图存储过程.
实际操做首先须要Elmah节点添加以下内容:
1: <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="SQlServerConStr" />
在该数据执行以下SQL语句.请参考官方的链接.
Elmah SQL Server Script File:http://code.google.com/p/elmah/source/browse/src/Elmah/SQLServer.sql
执行sQL语句完成后会在当前数据库看到表:
当再次运行应用程序.在Throw ArgumentNullException时查询数据库:
可见简单实用.另外针对SQL语句执行所有以官方标准为主.不一样数据库之间SQL Script脚本会存在必定的差别.
在使用Elmah过程发一下一些特色.这里须要说明一下.
Elmah是经过Http Modules 和Http Handler来记录和展现程序捕获的异常. 可是若是你在应用程序中添加异常处理模块.Try-Catch Elmah是没法记录到的.或是在Catch后在Throw出来. 在整个应用程序异常链上. 只有最终的异常抛给了Asp.net运行时Elmah组件才能捕获到并记录.
有不少人认为加入Elmah组件后可以处理应用异常.其实本质上Elmah本质上是一个日志记录工具.并无处理异常的能力.因此若是异常发生.不会改变原来应用程序给用户体验.依然还会出现黄色页面.
在官方Note明确提到一个例外.:
ELMAH捕获异常是基于HttpApplication对象的Error事件。
若是软件项目中的一些处理致使了HttpApplication事件没法被触发(好比在发生异常后,还没来得及执行Application_Error,就执行了Server.ClearError()方法,
会阻止Error事件的触发,再好比,若是一个异常被try-catch捕获到,而且没有再次throw,那么异常也是不会最终触发Error事件)
日志记录工具仍是很多的,好比著名的Log4net以及Enterprise Library中的Logging Application Block。能够说,这些工具相对ELMAH来讲,过重量级了,他们能够记录各类日志信息,好比监视代码中变量的变化状况,周期性的记录到文件中供其余应用进行统计分析工做;跟踪代码运行时轨迹,做为往后审计的依据;担当集成开发环境中的调试器的做用,向文件或控制台打印代码的调试信息。所以,若是仅仅是记录ASP.NET的错误日志.而Elmah开源且足够Clean.首选.