不管是在開發階段還是真實上線的狀態,總還是會有原本工程師遺漏的邏輯漏洞。以前總是要請使用者抓畫面,才能取得完整的錯誤訊息,且這樣的話無法即時收到錯誤的訊息;以前都是用土法煉鋼的方式弄一個 ErrorLogger 類別之類的東西來記錄,原來真實世界上已經有很多商業與 OpenSource 的套件可以使用,今天要介紹的是 Elmah。下圖來源為原專案網站,這是根目錄下的管理介面,顯示著錯誤例外發生的日期、類型、訊息簡介等,傑克,真的太神奇了!


1. 基本安裝與設定

已經有太多的資源可查詢,這邊就不廢話,直接放連結請大家參閱囉。基本上就是先把該組件參考至專案中,接著設定 Web.config 檔就可以運作了。


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 的方式做管理。