Logging Application Block (二):透過 E-mail 寄送 log 訊息

本文將示範如何在 ASP.NET 網站中透過 Logging Application Block 記錄 log 訊息,包括:
  • 使用 Filter 和 Severity 屬性的設定來篩選想要記錄的訊息。
  • 將 ASP.NET 網站未處理的 exception 輸出至 log。
  • 輸出的 log 訊息將透過 STMP 寄送至指定的 e-mail 信箱。

為了避免篇幅太長,這裡就不再貼太多之前已經看過的組態檔編輯和屬性設定等基本操作的畫面截圖,若對那些操作還不熟悉的話,可以先參考第一篇入門教學

練習步驟
  1. 建立一個 Web site 專案。
  2. 使用 Enterprise Library 組態檔編輯器開啟 web.config。作法:在 Solution Explorer 中的 web.config 上點右鍵,選「Edit Enterprise Library Configuration」。
  3. 由於不需要將 log 訊息寫入 Windows 事件日誌,所以先把預設產生的幾個 Formatted EventLog Trace Listener 移除掉(在組態項目上點右鍵,選 Remove)。
  4. 在節點 Logging Application Block > Trace Listeners 上點右鍵,選 New > Email Trace Listener。
  5. 設定此 Email Trace Listener 的屬性,包括:FromAddress(寄件人信箱位址)、SmtpServer(SMTP 伺服器名稱)、ToAddress(收件人信箱位址,寄給多個信箱時用分號隔開)。假設我們只想記錄最嚴重的錯誤,所以把 Filter 屬性設定為「Critical」。參考下圖:



  6. 在節點 Logging Application Block > Category Sources > General 上點右鍵,選 New > Trace Listener Reference,然後設定其 ReferencedTraceListener 屬性為 "Email TraceListener"。
  7. 加入 .NET 組件參考:Enterprise Library Logging Application Block。
  8. 在網站專案中加入 Global Application Class(Global.asax)。這裡我們打算將網站未處理的錯誤輸出至 log。
  9. 編輯 Global.asax,先在程式碼頂端加入 namespace 引用:

    <%@ Import Namespace="Microsoft.Practices.EnterpriseLibrary.Logging" %>

    接著撰寫 Application _Error 事件處理常式:

       1:  void Application_Error(object sender, EventArgs e) 
       2:  {
       3:      // 取得 exception 物件
       4:      Exception ex = Server.GetLastError().GetBaseException();
       5:      
       6:      if (Logger.IsLoggingEnabled())
       7:      {               
       8:          LogEntry log = new LogEntry();
       9:          log.Severity = System.Diagnostics.TraceEventType.Critical;
      10:          log.Message = ex.Message;
      11:          log.TimeStamp = DateTime.Now;
      12:  
    
      13:          Logger.Write(log);
      14:      }
      15:  }
  10. 在 Default.aspx 頁面的 Page_Load 事件輸出一個嚴重等級為 Information 的 log 訊息,然後在頁面上放一個 Button,並在此按鈕按下時丟出 exception。程式碼如下:

       1:      protected void Page_Load(object sender, EventArgs e)
       2:      {
       3:          LogEntry log = new LogEntry();
       4:          log.Message = "不重要的 log 訊息";
       5:          log.Severity = System.Diagnostics.TraceEventType.Information;
       6:          Logger.Write(log);
       7:      }
       8:  
    
       9:      protected void Button1_Click(object sender, EventArgs e)
      10:      {
      11:          throw new Exception("Bad things happened!");
      12:      }
  11. 用瀏覽器開啟 Default.aspx 網頁,按一下頁面上的按鈕,然後收信看看。如果步驟 5 的設定正確,你指定的收信信箱應該會有一封標題為「Critical」的信件,信件內容為「Bad things happened!」。由於步驟 5 有指定 Filter 為 "Critical",表示只有屬於此嚴重等級(或更嚴重)的訊息才會被記錄下來,因此在 Page_Load 事件中輸出的 Information 等級的 log 訊息便會被忽略。
一個小問題

在進行步驟 5 的時候,你可能會注意到,Email Trace Listener 並沒有提供 STMP 帳號驗證的屬性。換句話說,如果你的SMTP 伺服器需要驗證帳號才允許寄信,而且你非得用這個 SMTP 伺服器不可 ,那恐怕就得自己寫一個 trace listener 了。

相關文章
Copyright © 2012. Huan-Lin 學習筆記 - All Rights Reserved
Powered by Blogger
Template Design by Cool Blogger Tutorials
Published by Templates Doctor