2012年9月11日 星期二

ELMAH - 設定錯誤通知信件的主旨


在以前的 ELMAH 文章有介紹過怎麼讓 ELMAH 所捕捉到的訊息寄出 Email 到指定的電子信箱中:

ASP.NET MVC + ELMAH 監控並記錄你的網站錯誤資訊 3 
(elmah 的信件通知設定與 favicon.icon 404 錯誤過濾)

另外也有在另一篇文章中說明對特定的 Exception 使用不同的 mail 設定做寄發錯誤通知信的處理:

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

上面的那兩篇文章都有提到錯誤通知信件的主旨要怎麼設定,但是上面文章中所說的設定方式卻會讓每次寄發出去的錯誤通知信件主旨都會是一樣的,為了可以方便地分辨錯誤通知信的不同,所以我們可以對信件主旨來做點不一樣的設定。



在 ELMAH 的 Wiki 中的「Configuring error notifications」有說明要寄發錯誤通知信時有哪些項目要做什麼樣的設定,其中的「Subject」這個選項並不是一個必選的項目,那先來看看沒有做 Subject 設定時所收到的通知信件主旨是什麼樣子的,

image

沒有設定 subject 的情況下是把 Exception 的 Message 作為信件主旨,

image

假如我們去加入 ELMAH Emal Subject 的設定值,如下:

image

看一下收到的 Elmah 通知信件其主旨為何?

由下圖裡可以看到通知信件的主旨已經改為我們自己所設定的內容了,

image

 

但無論發生什麼錯誤都是用同樣的信件主旨嗎?

也不是說不可以,只是所有的 Elmah 錯誤通知信主旨都長得一樣,這樣就無法有效做區分與辨識,另外在專案開發、測試、正式上線這三個階段,都會有程式出現例外異常的時候,當錯誤發生的時候,都是用一樣的信件主旨時,這樣根本無法區分這個通知信是哪一台機器所發出的,再來就是,Elamh 錯誤通知信的內容有載明錯誤發生的時間,但這個時間並不是當地的時間,所以有時候看時間還需要自己做個轉換之後才能夠知道是什麼時間點發錯誤,所以也可以在通知信的主旨加入當地時間,最後,還是希望在信件主旨中能夠有原來的錯誤訊息。

統整一下上面的需求,在 ELMAH 錯誤通知信主只要有以下的內容:

    1. 機器名稱
    2. 錯誤發生的當地時間
    3. 原來的錯誤訊息

 

首先在 Web.Config 中的 Elmah Error Mail 設定做以下的調整,

image

對應一下上面整理出來的幾個需求,

主旨開頭加入「ELMAH 錯誤記錄 =>」以方便作為辨識

$MachineName$ 顯示機器名稱,這個組合並沒有規則,我會這樣設定是為了方便在後續的程式中做字串的替換,

$ErrorTime$ 錯誤發生時間

{0} 這是要放置原本 Elmah ErrorMail 的預設主旨內容

 

處理好 Web.Config 的 Elmah ErrorMail 設定後,接下來就是要在 Global.asax 中的 ErrorMail_Mailing() 方法中做設定,如果在你的 Global.asax 程式中沒有 ErrorMail_Mailing() 方法時,就加入一下的 Method 區段,

void ErrorMail_Mailing(object sender, Elmah.ErrorMailEventArgs e)
{
 
 
}

再來就用以下的程式對 Elmah Error Mail 主旨進行處理:

void ErrorMail_Mailing(object sender, Elmah.ErrorMailEventArgs e)
{
    string machineName = Request.ServerVariables[“HTTP_HOST”];
    string currentDateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
    // 取得 Elamh ErrorMail 的主旨
    // "$MachineName$ at $ErrorTime$ : {0}"
    string elmahSubject = e.Mail.Subject;
    //替換 ErrorMail 的主旨內容
    string emailSubject = string.Format("ELMAH 錯誤記錄 => {0}",
        elmahSubject
            .Replace("$MachineName$", machineName)
            .Replace("$ErrorTime$", currentDateTime)
    );
    e.Mail.Subject = emailSubject;
}

在以上的程式中,一開始取得網站執行主機的機器名稱,再來取得時間,然後取得由 Elmah ErrorMail 依據 ErrorMail 設定產生主旨,最後就是將機器名稱與執行時間去替代 ErrorMail Subject 中的關鍵字,

最後收到的 Elmah Error Mail 主旨就會是以下這樣:

image

 

最後我們來比較一下 Elmah Error Mail 主旨的不同,

image

最下面的是最原始的 Error Mail 主旨,再來倒數第二個則是固定設定在 Web.Config Elmah ErrorMail 的 subject 的內容,最上面的兩個就是採用自定主旨內容的方式所接收到的 Error Mail 主旨,最後的兩封信件比較容易辨識出來,而且對於信件的搜尋也更加方便。

 


上面所介紹的「自定主旨內容」,主旨的格式或是要放些什麼樣的文字都可以做設定,或者是也可以在 Global.asax 的 ErrorMail_Mailing() 方法中去做程式的處理,不必讓 Elmah Error Mail 主旨讓我們無法容易分辨,畢竟錯誤的處理是要「又快又準確」!

 

以上

1 則留言:

提醒

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