當網站還在開發階段,我們隨時都可以使用 debug 或 trace 來除錯或追蹤網頁資訊。 如果網站在部署之後,我們想要監控系統的錯誤訊息或效能等問題, 就可以透過 ASP.NET 提供的「健康監視 (Health Monitoring)」功能, 將這些訊息輸出到指定事件記錄器或者資料庫之中。
健康監視類別 (Health Monitoring)
ASP.NET 2.0 的「健康監視」功能,是將每一種 Web 事件以一個類別來包裝,並且提供相對應的 Provider 來讀取. 我們只要透過 web.config 設定,不用寫程式碼就可以使用。 只要設定好想要追蹤的事件,就可以將訊息記錄在事件記錄器、轉寄到 e-mail或者儲存在 SQL Server 資料庫。
System.Web.Management 命名空間包含數種健檢事件的型別,以及負責處理這份資料的提供者型別。
內建 Web 事件 (ASP.NET Web Event)
不同的健檢事件,以不同的類別包裝,如下表所示:
- WebBaseEvent :定義 ASP.NET 健康監視事件的基底類別。
- WebManagementEvent :定義包含應用程式和處理序資訊之事件的基底類別。
- WebHeartbeatEvent :定義定期引發的健康監視事件。
- WebRequestEvent :The base class that contains web request information
- WebApplicationLifetimeEvent :表示應用程式存留期中的重大事件。
- WebBaseErrorEvent :所有健康監視錯誤事件的基底類別。
- WebErrorEvent :Used to provide information about an error when it occurs in your application
- WebRequestErrorEvent :Contains request data for request errors
- WebAuditEvent :所有 ASP.NET 健康監視稽核事件的基底類別。
- WebSuccessAuditEvent :成功的安全性事件之相關資訊。
- WebFailureAuditEvent :關於安全性失敗的資訊。
- WebAuthenticationFailureAuditEvent :Used to provide information when a failed attempt at user authentication occurs on the site
- WebViewStateFailureAuditEvent :Raised when the view state fails to load (typically as a result of tampering)
事件提供者 ( ASP.NET Event Provider (Listeners) )
Provider (Listeners) 是用來收集 Web event 的資訊,並 log 這些資訊。 不同的提供者(Provider),會將訊息記錄到不同的位置,下表是預設的 Provider , 我你可以直接使用這些 Provicer 或者使用繼承後的自訂類別。
- EventLogWebEventProvider :將 Web 事件寫入 Windows 事件記錄檔。
- SqlWebEventProvider :將 Web 事件寫入 SQL Server 資料庫。
- WmiWebEventProvider :將 Web 事件傳送至 WMI。
- SimpleMailWebEventProvider :透過 email 傳送 Web 事件。
- TraceWebEventProvider :將 Web 事件傳送至網頁追蹤系統。
啟用健康監視
要使用健康監視功能,就必須先在 Web.config 中先啟用 Web Events 功能。 這個功能使用 <healthMonitoring> 標籤來表達。
<healthmonitoring> 區段設定說明
<healthMonitoring Enabled="true|false" heartbeatInterval="10"> <bufferModes>...</bufferModes> <providers>...</providers> <eventMappings>...</eventMappings> <profiles>...</profiles> <rules>...</rules> </healthMonitoring>
- providers :定義負責處理事件的健康監視提供者。
您可以依應用程式的需要加入多個提供者,提供者會處理健康事件。 - eventMappings :對應 Web Event 類別,用來訂閱要監控的事件。
這個標記項目可以讓您設定一個易記名稱來表示事件的來源。 它會被使用在 rules 標記中,以便程 Provider 產生關聯。 - rules :將事件對應至提供者。
定義提供者與事件的關聯規則,也就是指定你所訂閱的事件該由哪個 Provider 處理。
<system.web> <healthMonitoring enabled="true"> <providers> <clear /> <add name="SqlWebEventProvider" type="System.Web.Management.SqlWebEventProvider" connectionStringName="AspNetSqlConnectionString" /> </providers> <eventMappings> <clear /> <add name="All Errors" type="System.Web.Management.WebBaseErrorEvent" /> </eventMappings> <rules> <clear/> <add name="All Errors Default" eventName="All Errors" provider="SqlWebEventProvider" minInstances="1" maxLimit="Infinite" minInterval="00:00:00" /> </rules> </healthMonitoring> </system.web>
上面這個範例使用到<eventMappings>區段,但為什麼前一個範例沒有?而且前一個範例中的 eventName 又是哪來的呢?
這是因為全域的 web.config 檔中已經有一個定義好的<eventMappings>區段,所以若沒有特別需求就可以直接使用裡面定義的 eventName 來訂閱該類型的事件。
底下是由 C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\Web.config 中截取出來的設定
<!--預設的三個 Provider --> <providers> <add name="EventLogProvider" type="System.Web.Management.EventLogWebEventProvider,System.Web,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" /> <add connectionStringName="LocalSqlServer" maxEventDetailsLength="1073741823" buffer="false" bufferMode="Notification" name="SqlWebEventProvider" type="System.Web.Management.SqlWebEventProvider,System.Web,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" /> <add name="WmiWebEventProvider" type="System.Web.Management.WmiWebEventProvider,System.Web,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" /> </providers> <!--預設的 rules --> <rules> <add name="All Errors Default" eventName="All Errors" provider="EventLogProvider" profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:01:00" custom="" /> <add name="Failure Audits Default" eventName="Failure Audits" provider="EventLogProvider" profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:01:00" custom="" /> </rules> <!--預設的 eventMappings --> <eventMappings> <add name="All Events" type="System.Web.Management.WebBaseEvent,System.Web,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" /> <add name="Heartbeats" type="System.Web.Management.WebHeartbeatEvent,System.Web,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" /> <add name="Application Lifetime Events" type="System.Web.Management.WebApplicationLifetimeEvent,System.Web,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" /> <add name="Request Processing Events" type="System.Web.Management.WebRequestEvent,System.Web,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" /> <add name="All Errors" type="System.Web.Management.WebBaseErrorEvent,System.Web,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" /> <add name="Infrastructure Errors" type="System.Web.Management.WebErrorEvent,System.Web,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" /> <add name="Request Processing Errors" type="System.Web.Management.WebRequestErrorEvent,System.Web,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" /> <add name="All Audits" type="System.Web.Management.WebAuditEvent,System.Web,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" /> <add name="Failure Audits" type="System.Web.Management.WebFailureAuditEvent,System.Web,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" /> <add name="Success Audits" type="System.Web.Management.WebSuccessAuditEvent,System.Web,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" /> </eventMappings>
healthMonitoring 規則的 add 項目
<add name="rule's name" eventName="event name" custom="String" profile="profile name" provider="provider name" minInstances="number" maxLimit="number" minInterval="00:01:00"/>
- name :此規則的名稱。
- provider :套用至此規則的設定檔。
- eventName :指定事件的名稱。
- minInterval : 指定兩個事件之間的最小時間間隔。
如何啟用健康監視
<healthMonitoring enabled="true" heartbeatInterval="1">
例中的 heartbeatInterval 是用來指定引發 WebHeartbeatEvent 事件的間隔頻率 (以秒為單位)。預設值為 "00:00:00",表示不會引發任何 WebHeartbeatEvent 事件。
原則上,如果只做這樣的設定,就已經啟用健康監視功能。因為它會繼承全域 Web.config 的預設組態設定,這個檔案位於以下目錄:
%windir%\Microsoft.Net\Framework\v2.0.*\config\Web.config
在這個預設組態中已經加入了 "All Errors" 和 "Failure Audits" 事件 若要訂閱其他符合自已需求的事件和提供者,可以參考以下示範
如何訂閱事件與指定提供者
下面這個例子示範如何訂閱 Application Lifetime 事件,並儲存到 SQL Server
<connectionStrings> <add name="aspnetdb" connectionString="Data Source=myDB; Initial Catalog=aspnetdb; ..." providerName="System.Data.SqlClient" /> </connectionStrings> <system.web> <healthMonitoring enabled="true" heartbeatInterval="1"> <providers> <add name="sqlProvider" type="System.Web.Management.SqlWebEventProvider" connectionStringName="aspnetdb" buffer="false" bufferMode="Notification" /> </providers> <rules> <add name="App Lifetime" eventName="Application Lifetime Events" provider="sqlProvider"/> </rules> </healthMonitoring> </system.web>
下面這個例子示範如何訂閱 All Errors 事件,並寄送到 email
<system.web> <healthMonitoring enabled="true" heartbeatInterval="1"> <providers> <add name="SimpleMailWebEventProvider" type="System.Web.Management.SimpleMailWebEventProvider" maxEventsPerMessage="10" maxMessagesPerNotification="1" buffer="true" bufferMode="Critical Notification" from="test@gmail.com" to="test@gmail.com" subjectPrefix="My Web Events"/> </providers> <rules> <add name="App Errors" eventName="All Errors" provider="SimpleMailWebEventProvider" profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:01:00" custom="" /> </rules> </healthMonitoring> </system.web> <system.net> <mailSettings> <smtp from="test@gmail.com"> <network host="smtp.gmail.com" userName="test@gmail.com" password="test1234" port="587" enableSsl="true" /> </smtp> </mailSettings> </system.net>
實例演練
這個範例會示範如何接聽 WebBaseErrorEvent ,並將 log 記錄到 EventLog 、 SqlServer 並且 Mail 給指定帳戶。
ASP.NET 健康監視處理過程
下圖是健康監視的處理過程。
下列步驟描述上圖中 ASP.NET 健康監視是如何將設定的監視的事件資料傳送至 WMI 。
- ASP.NET 會根據組態設定引發健康事件。
- ASP.NET 會根據組態設定,將事件分派至 WmiWebEventProvider 提供者
- WmiWebEventProvider 提供者會透過 Unmanaged 呼叫將事件資訊傳遞至 WMI 系統。
- 最後,WMI 會將相關資料傳遞至自訂應用程式。
設定健康監視
<!--1。啟用健康監視--><healthMonitoring enabled="true" heartbeatInterval="1"> <!--2。加入 eventMappings , 設定要偵測網頁事件 , 並給定一個易記名稱--> <eventMappings> <add name="My All Errors" type="System.Web.Management.WebBaseErrorEvent,System.Web,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" /> </eventMappings> <!--3。加入 providers , 設定負責處理事件的提供者--> <providers> <add name="mySqlProvider" type="System.Web.Management.SqlWebEventProvider" buffer="true" bufferMode="Critical Notification" connectionStringName="aspnetdb" /> <add name="myEventLogProvider" type="System.Web.Management.EventLogWebEventProvider" /> <add name="myMailProvider" type="System.Web.Management.SimpleMailWebEventProvider" maxEventsPerMessage="10" maxMessagesPerNotification="1" buffer="true" bufferMode="Critical Notification" from="vxxxxxxo@gmail.com" to="vxxxxxxo@gmail.com" subjectPrefix="WebError"/> </providers>
圖:Log to EventLog
圖:Log to SQL Server
圖:Log to Email
沒有留言:
張貼留言