常在服務器端處理用戶請求時.特別是針對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.首選.