使用 ASP.NET 狀況監控記錄錯誤的詳細資料 (VB)
Microsoft的健康情況監視系統提供簡單且可自定義的方式記錄各種 Web 事件,包括未處理的例外狀況。 本教學課程會逐步引導您設定健全狀況監視系統,以將未處理的例外狀況記錄至資料庫,以及透過電子郵件訊息通知開發人員。
簡介
記錄是監視已部署應用程式健康情況,以及診斷可能發生之任何問題的實用工具。 記錄已部署應用程式中發生的錯誤特別重要,以便加以補救。 Error
每當 ASP.NET 應用程式中發生未處理的例外狀況時,就會引發事件;上一個教學課程示範如何透過建立Error
事件的事件處理程式來通知開發人員錯誤並記錄其詳細數據。 不過,建立 Error
事件處理程式來記錄錯誤的詳細數據,並通知開發人員是不必要的,因為 ASP 可以執行這項工作。NET 的健康 情況監視系統。
健康情況監視系統是在 ASP.NET 2.0 中引進的,其設計目的是藉由記錄應用程式或要求存留期間發生的事件,來監視已部署 ASP.NET 應用程式的健康情況。 健康情況監視系統記錄的事件稱為 健康情況監視事件 或 Web 事件,包括:
- 應用程式存留期事件,例如應用程式啟動或停止時
- 安全性事件,包括失敗的登入嘗試和失敗的URL授權要求
- 應用程式錯誤,包括未處理的例外狀況、檢視狀態剖析例外狀況、要求驗證例外狀況和編譯錯誤,以及其他類型的錯誤。
當引發健康情況監視事件時,可以將它記錄到任何數目的指定 記錄來源。 健康情況監視系統隨附記錄來源,這些記錄來源會將 Web 事件記錄到 Microsoft SQL Server 資料庫、Windows 事件記錄檔,或透過電子郵件訊息等。 您也可以建立自己的記錄來源。
健康情況監視系統記錄以及所使用的記錄來源事件定義於 中 Web.config
。 透過幾行組態標記,您可以使用健康情況監視,將所有未處理的例外狀況記錄到資料庫,並透過電子郵件通知您例外狀況。
探索 狀況監控 系統的組態
健康情況監視系統的行為是由其組態資訊所定義,其位於 <healthMonitoring>
中的Web.config
專案。 此組態區段會定義下列三個重要資訊:
- 應該記錄引發的健康情況監視事件,
- 記錄來源和
- 在 (1) 中定義的每個健康情況監視事件如何對應至 (2) 中定義的記錄來源。
這項資訊會分別透過三個子系組態專案來指定: <eventMappings>
、 <providers>
和 <rules>
。
您可以在資料夾中的 Web.config
%WINDIR%\Microsoft.NET\Framework\version\CONFIG
檔案中找到預設健全狀況監視系統組態資訊。 此預設組態資訊會移除一些標記以求簡潔,如下所示:
<configuration>
<system.web>
<healthMonitoring>
<eventMappings>
<add name="All Errors" type="System.Web.Management.WebBaseErrorEvent,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" startEventCode="0" endEventCode="2147483647"/>
<add name="Failure Audits" type="System.Web.Management.WebFailureAuditEvent,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" startEventCode="0" endEventCode="2147483647"/>
</eventMappings>
<providers>
<add name="EventLogProvider" type="System.Web.Management.EventLogWebEventProvider,System.Web,Version=2.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=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
<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>
</healthMonitoring>
</system.web>
</configuration>
感興趣的健康情況監視事件定義在 元素中 <eventMappings>
,這會為健康情況監視事件的類別提供人類易記的名稱。 在上述標記中 <eventMappings>
,元素會將人類易記名稱 「All Errors」 指派給類型 WebBaseErrorEvent
的健康情況監視事件,並將名稱 「Failure Audits」 指派給 類型 WebFailureAuditEvent
的健康情況監視事件。
元素 <providers>
會定義記錄來源,並指定任何記錄檔來源特定的組態資訊,併為其指定易記的名稱。 第一個專案 <add>
會定義 「EventLogProvider」 提供者,該提供者會使用 EventLogWebEventProvider
類別記錄指定的健康情況監視事件。 類別會將 EventLogWebEventProvider
事件記錄到 Windows 事件記錄檔。 第二 <add>
個元素會定義 「SqlWebEventProvider」 提供者,它會透過 SqlWebEventProvider
類別將事件記錄至Microsoft SQL Server 資料庫。 “SqlWebEventProvider” 組態會指定資料庫的 連接字串 (connectionStringName
) 以及其他組態選項。
元素 <rules>
會將 元素中指定的 <eventMappings>
事件對應至 專案中的 <providers>
記錄來源。 根據預設,ASP.NET Web 應用程式會將所有未處理的例外狀況和稽核失敗記錄到 Windows 事件記錄檔。
將事件記錄至資料庫
健康情況監視系統的預設組態可以藉由將區段新增 <healthMonitoring>
至應用程式的 Web.config
檔案,以 Web 應用程式為基礎來自定義。 您可以使用 元素, <eventMappings>
在、 <providers>
和 <rules>
區段中 <add>
加入其他元素。 若要從預設組態中移除設定, <remove>
請使用 元素,或使用 <clear />
從其中一個區段移除所有預設值。 讓我們設定 Book Reviews Web 應用程式,以使用 SqlWebEventProvider
類別將所有未處理的例外狀況記錄至Microsoft SQL Server 資料庫。
類別 SqlWebEventProvider
是健全狀況監視系統的一部分,並將健康情況監視事件記錄至指定的 SQL Server 資料庫。 類別 SqlWebEventProvider
預期指定的資料庫包含名為 aspnet_WebEvent_LogEvent
的預存程式。 此預存程式會傳遞事件的詳細數據,並負責儲存事件詳細數據。 好消息是,您不需要建立此預存程式,也不需要數據表來儲存事件詳細數據。 您可以使用 工具將這些物件新增至資料庫 aspnet_regsql.exe
。
注意
當我們新增 ASP 的支援時,工具aspnet_regsql.exe
已在設定使用應用程式服務的網站教學課程中討論。NET 的應用程式服務。 因此,Book Reviews 網站的資料庫已經包含 aspnet_WebEvent_LogEvent
預存程式,此預存程式會將事件資訊儲存到名為的 aspnet_WebEvent_Events
數據表中。
將必要的預存程式和數據表新增至資料庫之後,剩下的一切都是指示健康情況監視將所有未處理的例外狀況記錄至資料庫。 將下列標記新增至您的網站 Web.config
檔案,以達成此目的:
<configuration>
...
<system.web>
...
<healthMonitoring enabled="true">
<eventMappings>
<clear />
<add name="All Errors" type="System.Web.Management.WebBaseErrorEvent"
startEventCode="0" endEventCode="2147483647" />
</eventMappings>
<providers>
<clear />
<add connectionStringName="ReviewsConnectionString" maxEventDetailsLength="1073741823"
buffer="false" name="SqlWebEventProvider"
type="System.Web.Management.SqlWebEventProvider" />
</providers>
<rules>
<clear />
<add name="All Errors Default" eventName="All Errors" provider="SqlWebEventProvider"
profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:00:00" />
</rules>
</healthMonitoring>
</system.web>
</configuration>
上述健康情況監視組態標記會使用 <clear />
元素,從 <eventMappings>
、 <providers>
和 <rules>
區段抹除預先定義的健全狀況監視組態資訊。 然後,它會將單一專案新增至每個區段。
- 元素
<eventMappings>
會定義名為 「All Errors」 的單一健康情況監視事件,每當發生未處理的例外狀況時,就會引發此事件。 - 元素
<providers>
會定義使用 類別的單一記錄來源 「SqlWebEventProvider」。。SqlWebEventProvider
屬性connectionStringName
已設定為 “ReviewsConnectionString”,這是區段中定義的<connectionStrings>
連接字串 名稱。 - 最後, <rules> 元素會指出當 「All Errors」 事件轉譯時,應該使用 「SqlWebEventProvider」 提供者來記錄它。
此設定資訊會指示健康情況監視系統將所有未處理的例外狀況記錄到 Book Reviews 資料庫。
注意
事件 WebBaseErrorEvent
只會針對伺服器錯誤引發;不會針對 HTTP 錯誤引發,例如找不到 ASP.NET 資源的要求。 這與類別Error
事件的行為HttpApplication
不同,這同時針對伺服器和 HTTP 錯誤引發。
若要查看運作中的健全狀況監視系統,請造訪網站並流覽 Genre.aspx?ID=foo
來產生運行時錯誤。 您應該會看到適當的錯誤頁面 - 例外狀況詳細數據死亡畫面(在本機流覽時)或自定義錯誤頁面(在實際執行中瀏覽網站時)。 在幕後,健康情況監視系統會將錯誤資訊記錄到資料庫。 數據表中 aspnet_WebEvent_Events
應該有一筆記錄(請參閱 圖 1):此記錄包含剛發生之運行時錯誤的相關信息。
圖 1:錯誤詳細數據已記錄至 aspnet_WebEvent_Events
資料表
(點擊查看完整圖片)
在網頁中顯示錯誤記錄檔
使用網站的目前設定,健康情況監視系統會將所有未處理的例外狀況記錄到資料庫。 不過,健康情況監視不提供任何機制,可透過網頁檢視錯誤記錄檔。 不過,您可以建置 ASP.NET 頁面,以從資料庫顯示此資訊。 (如我們暫時看到,您可以選擇在電子郵件訊息中傳送錯誤詳細數據給您。
如果您建立這類頁面,請務必採取步驟,只允許授權的用戶檢視錯誤詳細數據。 如果您的網站已經採用使用者帳戶,您可以使用 URL 授權規則將頁面的存取限制為特定使用者或角色。 如需如何根據登入使用者授與或限制網頁存取的詳細資訊,請參閱我的 網站安全性教學課程。
注意
後續教學課程會探索名為 ELMAH 的替代錯誤記錄和通知系統。 ELMAH 包含內建機制,可從網頁和 RSS 摘要檢視錯誤記錄檔。
將事件記錄至電子郵件
健康情況監視系統包含記錄來源提供者,可「記錄」事件至電子郵件訊息。 記錄來源包含與電子郵件訊息本文中記錄至資料庫相同的資訊。 當特定健康情況監視事件發生時,您可以使用此記錄檔來源通知開發人員。
讓我們更新 Book Reviews 網站的設定,以便在發生例外狀況時收到電子郵件。 若要達成此目的,我們需要執行三項工作:
- 將 ASP.NET Web 應用程式設定為傳送電子郵件。 這可藉由指定如何透過
<system.net>
組態專案傳送電子郵件訊息來完成。 如需在 ASP.NET 應用程式中傳送電子郵件訊息的詳細資訊,請參閱 在 ASP.NET 和 System.Net.Mail 中傳送電子郵件。 - 在元素中
<providers>
註冊電子郵件記錄來源提供者,以及 - 將專案新增至
<rules>
專案,將「所有錯誤」事件對應至步驟 (2) 中新增的記錄來源提供者。
健全狀況監視系統包含兩個電子郵件記錄來源提供者類別: SimpleMailWebEventProvider
和 TemplatedMailWebEventProvider
。 類別SimpleMailWebEventProvider
會傳送純文本電子郵件訊息,其中包含事件詳細數據,並提供很少的電子郵件內文自定義。 使用 類別TemplatedMailWebEventProvider
,您可以指定轉譯標記做為電子郵件訊息本文的 ASP.NET 頁面。 類別TemplatedMailWebEventProvider
可讓您更充分掌控電子郵件訊息的內容和格式,但需要更預先的工作,因為您必須建立產生電子郵件訊息內文的 ASP.NET 頁面。 本教學課程著重於使用 類別 SimpleMailWebEventProvider
。
更新檔案中Web.config
健康情況監視系統的 <providers>
元素,以包含 類別的SimpleMailWebEventProvider
記錄來源:
<providers>
<clear />
<add type="System.Web.Management.SimpleMailWebEventProvider"
name="EmailWebEventProvider" buffer="false"
from="support@example.com" to="support@example.com"
subjectPrefix="Book Reviews Runtime Error: " />
<add connectionStringName="ReviewsConnectionString" maxEventDetailsLength="1073741823"
buffer="false" name="SqlWebEventProvider"
type="System.Web.Management.SqlWebEventProvider" />
</providers>
上述標記會 SimpleMailWebEventProvider
使用 類別作為記錄來源提供者,並指派易記名稱 「EmailWebEventProvider」。 此外,屬性 <add>
包含其他元件選項,例如電子郵件訊息的收件者位址。
定義電子郵件記錄來源后,所有剩餘專案都是指示健康情況監視系統使用此來源來「記錄」未處理的例外狀況。 這可藉由在 <rules>
區段中新增規則來完成:
<rules>
<clear />
<add name="All Errors To Email" eventName="All Errors" provider="EmailWebEventProvider"
profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:00:00" />
<add name="All Errors To Database" eventName="All Errors" provider="SqlWebEventProvider"
profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:00:00" />
</rules>
區 <rules>
段現在包含兩個規則。 第一個名為「所有錯誤到電子郵件」的第一個,會將所有未處理的例外狀況傳送至 「EmailWebEventProvider」 記錄來源。 此規則會影響將有關錯誤的詳細數據傳送至指定的 [收件者] 位址。 「所有錯誤到資料庫」規則會將錯誤詳細數據記錄到月臺的資料庫。 因此,每當網站發生未處理的例外狀況時,其詳細數據都會記錄到資料庫,並傳送至指定的電子郵件位址。
圖 2 顯示瀏覽 Genre.aspx?ID=foo
時 類別SimpleMailWebEventProvider
所產生的電子郵件。
圖 2:錯誤詳細資料會在電子郵件訊息中傳送
(點擊查看完整圖片)
摘要
ASP.NET 健康情況監視系統的設計目的是讓系統管理員監視已部署Web應用程式的健全狀況。 當特定動作展開時,就會引發健康情況監視事件,例如當應用程式停止、使用者成功登入網站時,或發生未處理的例外狀況時。 這些事件可以記錄到任意數目的記錄來源。 本教學課程示範如何將未處理的例外狀況詳細數據記錄到資料庫,以及透過電子郵件訊息。
本教學課程著重於使用健康情況監視來記錄未處理的例外狀況,但請記住,健康情況監視的設計目的是測量已部署 ASP.NET 應用程式的整體健康情況,並包含大量未在此探索的健康情況監視事件和記錄來源。 更重要的是,如果需要,您可以建立自己的健康情況監視事件和記錄來源。 如果您有興趣深入瞭解健康情況監視,第一個步驟是閱讀 Erik Reitan 的健康 情況監視常見問題。 接下來,請參閱如何:在 ASP.NET 2.0 中使用 狀況監控。
快樂程式!
深入閱讀
有關本教學課程中討論的主題的更多資訊,請參閱以下資源: