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

ASP.NET 2.0 有個 **[健康監視(healthMonitoring)](http://msdn.microsoft.com/zh-tw/library/bb398933.aspx)** 功能，可用來追蹤所有 Web 應用程式執行時期所發生的各種事件，例如：應用程式啟動(Application\_Start)、應用程式結束(Application\_End)、不安全的存取、發生例外狀況、…等等。可監視的範圍不限於「發生錯誤」而已，包括整個 Web 應用程式的生命週期都可完整紀錄下來，以便日後分析 Web 應用程式的健康狀況。

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

若想看系統預設的 **健康監視** 啟用了哪些提供者或記錄了哪些事件，可以利用[這個技巧](/post/2009/06/19/check-webconfig-default-settings-and-options-with-ease)查詢，如下圖示：

![系統預設的 健康監視 設定](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/984b7c63e0bc6dc3c1a5-image.png "系統預設的 健康監視 設定")

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

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

1\. 利用【[將 ASP.NET 的 SMTP 參數寫在 Web.Config 裡以簡化程式碼](/post/2008/11/12/Configure-Mail-Settings-in-webconfig-to-simplify-code)】文章描述的技巧設定郵件參數

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

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

```xml
<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 中，這時我的設定檔內容如下：

```csharp
<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)](http://msdn.microsoft.com/zh-tw/library/ms229862.aspx) 來建立，指令範例如下：( 該工具程式預設在 **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>](http://msdn.microsoft.com/zh-tw/library/yc5yk01w\(VS.80\).aspx) 項目設定了一堆事件類別的「別名」，定義一組比較容易記憶的名稱，如需查詢系統預設 web.config 可參考我另一篇文章【[如何快速查詢 web.config 中各項設定參數的預設值](/post/2009/06/19/check-webconfig-default-settings-and-options-with-ease)】。

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

**相關連結**

-   [FAQ - Health Monitoring in ASP.NET 2.0](http://forums.asp.net/t/1027461.aspx)
-   [Using the ASP.NET Health Monitoring Provider to Secure Your Application in the Case of an Attack](https://weblogs.asp.net/ricardoperes/using-the-asp-net-health-monitoring-provider-to-secure-your-application-in-the-case-of-an-attack)
-   [ASP.NET 健康監視](http://msdn.microsoft.com/zh-tw/library/ms178701\(VS.80\).aspx)
-   [ASP.NET 健康監視事件概觀](http://msdn.microsoft.com/zh-tw/library/ms178703\(VS.80\).aspx)
-   [設定 ASP.NET 健康監視](http://msdn.microsoft.com/zh-tw/library/ms178704\(VS.80\).aspx)
-   [ASP.NET SQL Server 註冊工具 (Aspnet\_regsql.exe)](http://msdn.microsoft.com/zh-tw/library/ms229862.aspx)
-   [healthMonitoring 項目 (ASP.NET 設定結構描述)](http://msdn.microsoft.com/zh-tw/library/2fwh2ss9.aspx)
-   [ASP.NET 健康監視事件概觀](http://msdn.microsoft.com/zh-tw/library/bb398933.aspx) (效能、疑難排解與偵錯)
-   [How To: Use Health Monitoring in ASP.NET 2.0](http://msdn.microsoft.com/en-us/library/ms998306.aspx)
-   [HOW TO：傳送健康監視通知的電子郵件](http://msdn.microsoft.com/zh-tw/library/ms227553.aspx)
-   [ASP.NET Health Monitor - 觀念及設定篇(一)](https://web.archive.org/web/20090530234718/http://www.dotblogs.com.tw/jameswu/archive/2009/05/27/8575.aspx)
-   [ASP.NET Health Monitor - 觀念及設定篇(二)](https://web.archive.org/web/20140527014326/http://www.dotblogs.com.tw/jameswu/archive/2009/06/09/8748.aspx)
-   [ASP.NET 2.0 Health Monitor健康監視](https://web.archive.org/web/20171120020932/http://blog.sina.com.tw/dotnet/article.php?pbgid=4907&entryid=420678)
-   [Health Monitoring](https://web.archive.org/web/20220809125635/http://dotnetslackers.com/articles/sql/HealthMonitoring.aspx)
-   [Health monitoring action filter for ASP.NET MVC](http://www.alexthissen.nl/blogs/main/archive/2008/07/01/health-monitoring-action-filter-for-asp-net-mvc.aspx)
-   [Health Monitoring and ASP.NET MVC](http://odetocode.com/Blogs/scott/archive/2009/10/11/health-monitoring-and-asp-net-mvc.aspx)
