Something about ELMAH (Error Logging Modules and Handlers)
Wednesday, June 23, 2010 by Unknown
不管是在開發階段還是真實上線的狀態,總還是會有原本工程師遺漏的邏輯漏洞。以前總是要請使用者抓畫面,才能取得完整的錯誤訊息,且這樣的話無法即時收到錯誤的訊息;以前都是用土法煉鋼的方式弄一個 ErrorLogger 類別之類的東西來記錄,原來真實世界上已經有很多商業與 OpenSource 的套件可以使用,今天要介紹的是 Elmah。下圖來源為原專案網站,這是根目錄下的管理介面,顯示著錯誤例外發生的日期、類型、訊息簡介等,傑克,真的太神奇了!
1. 基本安裝與設定
已經有太多的資源可查詢,這邊就不廢話,直接放連結請大家參閱囉。基本上就是先把該組件參考至專案中,接著設定 Web.config 檔就可以運作了。
- Elmah Wiki Pages: for example, Using ELMAH with ASP.NET MVC
- 如何偵錯--ELMAH 絕妙的偵錯工具安全架設於ASP.NET MVC
- 下載解壓縮後的路徑下 Elmah\samples\Demo 中有一個 Web.config.template 的檔案可以參考。
2. 儲存方式設定 Log errors to several back-end storages
Elmah 提供多種記錄錯誤的方式,包括實體的資料庫(MS SQL, SQLite, etc.)和檔案(XML),以及記憶體中。以下的例子是以 Microsoft SQL Server 2005 當例子說明。
2-1. Web.config setting & Create a Elmah database
<configuration> <elmah> <errorLog type="Elmah.SqlErrorLog , Elmah" connectionStringName="ELMAH.Sql" /> </elmah> <connectionStrings> <add name="ELMAH.Sql" connectionString="Data Source=YourDBSource; Initial Catalog=ELMAH;Persist Security Info=True; User ID=YourUserID;Password=YourPassword" providerName="System.Data.SqlClient" /> </connectionStrings> </configuration>
接著我們新增一個資料庫 ELMAH(上一段中所設定的資料庫名稱),接著很重要的是要執行解壓縮後路徑 Elmah-1.x\db 下的 SQLServer.sql 檔案,把程式需要叫用的 Stored Procedure 新增到 ELMAH 資料庫中;做完上述的設定後,執行 http://project.domain/elamh.axd 就可以看到錯誤列表頁面了。
3. 使用 Gmail 寄送錯誤訊息
這邊要特別設定的地方是 smtpPort="0",另外一些信件的相關設定也可以一併在該區段中設定。
<configuration> <elmah> <errorMail from="...@..." to="...@..." priority="high" smtpPort="0" useSsl="true" subject="Error form ELMAH: " async="true" /> </elmah> <system.net> <mailSettings> <smtp deliveryMethod="network"> <network host="smtp.gmail.com" port="587" userName ="YourGmailAccount@gmail.com" password ="YourGmailPassword" /> </smtp> </mailSettings> </system.net> </configuration>
收到信的範例如下圖。
或是參考下列的相關說明文章:4. 在 Web Service 中偵錯
若是用 ajax 呼叫後端的 Web Service 發生錯誤的話,你會發現 ELMAH 並沒有記錄該錯誤,找了 StackOverflow 似乎也沒有較好的作法,目前我是像那些網友建議的方式,用 try-catch 包住程式邏輯,來達成記錄錯誤的目的。請參閱這一篇討論 Handle exceptions in web services with Elmah
public int WebServiceMethod() { try { ... } catch (Excetion ex) { Elmah.ErrorLog.GetDefault( HttpContext.Current) .Log(new Elmah.Error(ex, HttpContext.Current)); } }
5. 安全性設定
當網站正式部署上線後,要讓維護人員可以進入 elamh.axd 需要下列的設定。請參閱這一篇 Allowing secure, remote access to your ELMAH error log: 這邊要注意的是,如果一般使用者和管理者都是透過同一頁面做登入驗證的話,可以在對應的 Controller 中再做處理,或是如同上一篇作者建議的用 Role 的方式做管理。