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 應用程式的健康狀態監控的掌握度會更高,下次遇到時就可以將整理好的設定拿出來直接套用。
相關連結