The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

利用健康監視(healthMonitoring)監控你的 ASP.NET 網站狀況

ASP.NET 2.0 有個 健康監視(healthMonitoring) 功能,可用來追蹤所有 Web 應用程式執行時期所發生的各種事件,例如:應用程式啟動(Application_Start)、應用程式結束(Application_End)、不安全的存取、發生例外狀況、…等等。可監視的範圍不限於「發生錯誤」而已,包括整個 Web 應用程式的生命週期都可完整紀錄下來,以便日後分析 Web 應用程式的健康狀況。

ASP.NET 2.0 的 健康監視 功能最大的特色就在於只要調整 web.config 即可完成 健康監視 的設定,幾乎一行程式都不用改寫,而且預設提供多組 提供者(Provider) 可方便讓你把想追蹤的事件記錄到事件檢視器、WMI、轉寄至電子郵件、或直接儲存到 SQL Server 資料庫中,非常的方便。

若想看系統預設的 健康監視 啟用了哪些提供者或記錄了哪些事件,可以利用這個技巧查詢,如下圖示:

系統預設的 健康監視 設定

有時後網站剛上線,為了立即獲得網站執行的所有狀況,我會選擇透過 E-mail 直接在第一時間告知我所有網站發生的事件,以便於即時處理所有狀況,好幾次客戶在操作的時候發生了異常情況,我大約在 10 秒內就撥電話跟他說明錯誤發生的原因 (例如: 操作錯誤),客戶還會嚇一跳呢,想說我們怎麼那麼厲害,連做錯了哪一步都知道!:-p

透過 E-mail 通知健康監視的事件有 2 個地方要注意與設定:

1. 利用【將 ASP.NET 的 SMTP 參數寫在 Web.Config 裡以簡化程式碼】文章描述的技巧設定郵件參數

<system.net>
  <mailSettings>
    <smtp deliveryMethod="Network">
      <network defaultCredentials="false" host="localhost" port="25" />
    </smtp>
  </mailSettings>
</system.net>

2. 新增 <healthMonitoring> 的 <providers> 與 <rules> 區段

<healthMonitoring enabled="true">
  <providers>
    <add name="SimpleMailWebEventProvider"
       type="System.Web.Management.SimpleMailWebEventProvider"
       maxEventsPerMessage="10" maxMessagesPerNotification="1"
       buffer="true" bufferMode="Critical Notification"
       from="webmaster@example.com" to="admin@example.com"
       subjectPrefix="My Web Events"/>
  </providers>
  <rules>
    <add name="AllEventsMail"
         eventName="All Events"
         provider="SimpleMailWebEventProvider"
         profile="Default"
         minInstances="1"
         maxLimit="Infinite"
         minInterval="00:01:00"
         custom="" />
  </rules>
</healthMonitoring>

等網站趨於穩定後,我不見得會啟用 健康監視 機制,因為啟用該機制會對網站執行效能帶來一些衝擊,但有時我也會將所有與應用程式生命週期有關的事件 (Application Lifetime Events) 儲存下來,並定時查看網站在上線後是否有異常的狀況。

我通常會將這些事件儲存到 SQL Server 中,這時我的設定檔內容如下:

<connectionStrings>
  <add connectionString="Data Source=(local)\SQLEXPRESS;........." 
       name="ApplicationServices" providerName="System.Data.SqlClient" />
</connectionStrings>

<system.web>

  <healthMonitoring enabled="true">

    <providers>
      <add name="sqlProvider"
           type="System.Web.Management.SqlWebEventProvider"
           connectionStringName="ApplicationServices"
           buffer="false"
           bufferMode="Notification" />
    </providers>

    <rules>
      <add name="lifeCycle"
           provider="sqlProvider"
           eventName="Application Lifetime Events" />
    </rules>

  </healthMonitoring>

</system.web>

注意:如果要將事件記錄到 SQL Server 中,資料庫裡必須要有 SQL Server provider 所建立的表格,建立相關表格可利用 .NET Framework 2.0 內建的 ASP.NET SQL Server 註冊工具 (aspnet_regsql.exe) 來建立,指令範例如下:( 該工具程式預設在 C:\Windows\Microsoft.NET\Framework\v2.0.50727 目錄下)

aspnet_regsql.exe -E -S <ServerName> -A w

由於 健康監視 的設定選項很多,初學者常常會不知到如何設定,尤其是我上述的兩個範例中,其中的 eventName 欄位一個設定 Application Lifetime Events 、另一個設定 All Events,這些特殊定義的名稱其實是定義在系統預設的 web.config 設定檔中,裡面有個 <eventMappings> 項目設定了一堆事件類別的「別名」,定義一組比較容易記憶的名稱,如需查詢系統預設 web.config 可參考我另一篇文章【如何快速查詢 web.config 中各項設定參數的預設值】。

其實常用的設定就那麼幾種,我建議還是先翻閱 MSDN 文件瞭解有哪些可以設定的項目,這樣對於 Web 應用程式的健康狀態監控的掌握度會更高,下次遇到時就可以將整理好的設定拿出來直接套用。

相關連結