Elmah 日志記錄組件


常在服務器端處理用戶請求時.特別是針對Web應用程序.當出現異常是可以根據日志操作記錄還原異常出現時操作步驟.而記錄異常堆棧信息判斷問題出現問題位置. 為了跟蹤和記錄服務器行為.特別是針對出現異常時構建簡單、統一的異常處理模式就顯得尤為重要.

如果有一個基礎的架構用來記錄服務器端中日志和事件.那么對於調試和在問題的解決就變得更加簡單直接.針對日志記錄.可能針對大部分開發人員.首先表現明顯就是應用程序底層或是運行時中存在Bug或是特定情況下Crash掉等. 比較明顯的行為.這時日志記錄目的是為了跟蹤應用程序的底層行為.了解出現異常時應用程序內部所執行的過程. 能夠幫助開發人員和軟件測試找到應用程序崩潰的原因. 快速解決問題.

而還有一些情況.是很難再開發階段把問題暴露出來.類似性能問題.而此時如果有了日志記錄服務端行為.則可以通過提供的詳細執行時間記錄可以很方便的找出應用的性能瓶頸.定位這些比較”隱性“問題.

所以花了點時間研究日志記錄組件.說說個人看法.

在開源日志管理上當然不得不提到是LogStash .

2013-01-22_162111

它是一個應用程序日志、事件的傳輸、處理、管理和搜索的平台.基於HTML5、Jquery、Css3和SVG等技術.所以也是跨平台的、跨瀏覽器的.可應用任何的Asp.net開發.可以用它來統一對應用程序日志進行收集管理.最難得可貴的提供Web接口用戶查詢和統計. 所以特點是跨平台同時也是足夠開放的.[這就是開源社區的力量.]推薦.

另外一個就是從Java移植過來的.Net版本Log4Net

 

 

ls-logo

這個可能給位已經很熟悉了.Log4net是從java平台下非常優秀的日志記錄框架Log4J移植到.NEt下版本.它也是Apache基金資助的項目的一部分.Log4net可以幫助我們把日志信息輸出到各種不同目標(文本文件、數據庫、控制台等)的.net類庫,它可以容易的加載到開發項目中,實現程序調試和運行的時候的日志信息輸出,提供了比.net自己提供的debug類和trace類的功能更多,使用起來也是非常的簡單.

在說道本篇即將提到的Elmah.

2013-01-22_163710

 

 

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:

2013-01-22_172012

添加Elmah引用:

2013-01-22_172204

如果采用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:      }

運行效果如下:

2013-01-22_173931

很明顯.當我們throw一個異常后.,會出現報錯的黃頁.在來看看Elmah是否記錄本次執行過程中出現ArgumentNullException.

2013-01-22_174214

可以看到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對存儲方式支持包含:

 

首先如果你只是引用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文件:

2013-01-26_152341

這種方式雖然簡單直觀.但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語句完成后會在當前數據庫看到表:

2013-01-26_150301

當再次運行應用程序.在Throw ArgumentNullException時查詢數據庫:

2013-01-26_151242

可見簡單實用.另外針對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.首選.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM