2011年10月11日 星期二

ELMAH - 自訂錯誤通知郵件的設定(於特定Exception)


在「ASP.NET MVC + ELMAH 監控並記錄你的網站錯誤資訊 3」這篇文章中介紹了ELMAH寄發郵件通知,

也說明了如何不去寄發特定Http StatuCode錯誤的信件通知,

但是在Web.Config的elmah Section的errorMail設定中,已經把寄發信件通知的Subject給統一處理了,

這樣一來就無法分辨寄來的錯誤通知的差異性,

因為有些錯誤是必須要能夠設定重要性,而且也需要在信件主旨中可以馬上辨識以快速處理,

所以接下來就是說明一下對於特定的Exception要如何去設定個別的見信重要性與信件主旨。


先看一下Web.Config中的elamh errorMail的設定:

  <elmah>
    <errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="~/App_Data/Elmah.Errors" />
    <security allowRemoteAccess="yes" />
    <errorMail
      from="寄出的Email"
      to="收信的Email"
      subject="通知信件的主旨"
      async="true"
      smtpPort="0"
      useSsl="true"/>
  </elmah>

這邊的設定是將elmah所捕捉到的錯誤寄發通知信件,而信件的主旨、重要性都是統一處理的,

也就是說,不管發生的錯誤是什麼,信件的重要性、主旨都是一樣的,這樣就無法有效分辨錯誤訊息的差異。

image

所以為了能夠方便區分錯誤通知的差異,所以就要手動做點修改。

 

於Global.asax中增加ErrorMail_Mailing()方法

如下所示:

    void ErrorMail_Mailing(object sender, Elmah.ErrorMailEventArgs e)
    {
      if (e.Error.Exception is NotImplementedException)
      {
        e.Mail.Priority = System.Net.Mail.MailPriority.High;
        e.Mail.Subject = "This is a high priority item! About「NotImplementedException」";
      }
      else if (e.Error.Exception is System.ApplicationException)
      {
        e.Mail.Priority = System.Net.Mail.MailPriority.High;
        e.Mail.Subject = "This is a high priority item! About「ApplicationException」";
        e.Mail.CC.Add("要另外通知人員的Email");
      }
    }

因為Exception的類別有很多種,我這邊僅拿兩種來做示範,

例如Exception類別為NotImplementException或ApplicationException時,就把錯誤通知信件的重要性設為High,

而信件的主旨也做了修改,而當發生ApplicationException時,還會CC給另一個需要通知的人員,

如此一來就可以在收到的錯誤通知信件裡馬上辨識,以加速處理網站的錯誤。

image

 

其實這樣的處理還是會有些不足,因為Exception的類型有太多種了,而且很難掌握程式發生例外到底是那一種,

不太可能去將所有的Exception都去做這樣的個別處理與設定,

這樣的客製化設定只能限定於某些常常發生的Exception上,因為這些常常發生Exception才是應該要多家關注並解決的,

最好的處理方式還是在try - catch的區塊中,去做好Exception的分級處理,

可以在系統中使用Log套件,例如:NLog, Log4Net, Coommon Logging, Enterprise Library Logging Application Block等,

於發生Exception時,將例外做好等級區分,當某些等級的例外發生時再去寄發通知信件,以充分掌握每個Exception的詳細資訊。

 

參考連結:

dotnetslackers.com - ELMAH - Error Logging Modules And Handlers

Scott On Writing.NET - Customizing ELMAH’s Error Emails

 

以上

2 則留言:

  1. 您好,
    請問我有多收件者時, 用下列設定會收不到,

    我是.NET 3.5, google後是查到用, 分隔, 但是依舊不行.

    回覆刪除
  2. 您好,
    OK了, CC裡面可以用,
    感謝.

    回覆刪除

提醒

千萬不要使用 Google Talk (Hangouts) 或 Facebook 及時通訊與我聯繫、提問,因為會掉訊息甚至我是過了好幾天之後才發現到你曾經傳給我訊息過,請多多使用「詢問與建議」(在左邊,就在左邊),另外比較深入的問題討論,或是有牽涉到你實作程式碼的內容,不適合在留言板裡留言討論,請務必使用「詢問與建議」功能(可以夾帶檔案),謝謝。