共用方式為


使用 ASP.NET 狀況監控記錄錯誤的詳細資料 (VB)

作者:Scott Mitchell

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. 記錄來源和
  3. (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

注意

當我們 aspnet_regsql.exe 新增 ASP 的支援時,工具會在設定 使用應用程式服務的網站 教學 課程中討論過。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> 會定義名為「所有錯誤」之感興趣的單一健康情況監視事件,每當發生未處理的例外狀況時,就會引發此事件。
  • 元素 <providers> 會定義使用 類別的單一記錄來源「SqlWebEventProvider」。 SqlWebEventProvider 屬性 connectionStringName 已設定為 「ReviewsConnectionString」,這是區 <connectionStrings> 段中定義的連接字串名稱。
  • 最後, < rules > 元素會指出當 「All Errors」 事件轉譯時,應該使用 「SqlWebEventProvider」 提供者來記錄它。

此設定資訊會指示健康情況監視系統將所有未處理的例外狀況記錄到書籍評論資料庫。

注意

事件 WebBaseErrorEvent 只會針對伺服器錯誤引發;不會針對 HTTP 錯誤引發,例如找不到 ASP.NET 資源的要求。 這與類別事件的行為 HttpApplicationError 不同,這同時針對伺服器和 HTTP 錯誤引發。

若要查看運作中的健全狀況監視系統,請流覽網站並流覽 Genre.aspx?ID=foo 以產生執行階段錯誤。 您應該會看到適當的錯誤頁面 - 造訪本機) 時的例外狀況詳細資料黃色螢幕 (,或造訪生產) 中的網站時 (自訂錯誤頁面。 在幕後,健康情況監視系統會將錯誤資訊記錄到資料庫。 資料表中 aspnet_WebEvent_Events 應該有一筆記錄 (請參閱 圖 1) ;此記錄包含剛發生的執行時間錯誤相關資訊。

此螢幕擷取畫面提供記錄至資料表的錯誤詳細資料。

圖 1:錯誤詳細資料已記錄至 aspnet_WebEvent_Events 資料表
(按一下即可檢視完整大小的映射)

在網頁中顯示錯誤記錄檔

使用網站的目前組態,健全狀況監視系統會將所有未處理的例外狀況記錄到資料庫。 不過,健康情況監視不提供任何機制,可透過網頁檢視錯誤記錄檔。 不過,您可以建置 ASP.NET 網頁,以顯示資料庫中的這項資訊。 (我們很快就會看到,您可以選擇在電子郵件訊息中傳送錯誤詳細資料。)

如果您建立這類頁面,請務必採取步驟,只允許授權的使用者檢視錯誤詳細資料。 如果您的網站已經採用使用者帳戶,您可以使用 URL 授權規則來限制特定使用者或角色的頁面存取。 如需如何根據登入使用者授與或限制網頁存取的詳細資訊,請參閱我的 網站安全性教學課程

注意

後續教學課程會探索名為 ELMAH 的替代錯誤記錄和通知系統。 ELMAH 包含內建機制,可從網頁和 RSS 摘要檢視錯誤記錄檔。

將事件記錄至 Email

健康情況監視系統包含記錄來源提供者,該提供者會將事件「記錄」到電子郵件訊息。 記錄來源包含相同的資訊,這些資訊會記錄到電子郵件訊息本文中的資料庫。 當發生特定健康情況監視事件時,您可以使用此記錄來源來通知開發人員。

讓我們更新書籍評論網站的設定,以便在發生例外狀況時收到電子郵件。 若要達成此目的,我們需要執行三項工作:

  1. 設定 ASP.NET Web 應用程式以傳送電子郵件。 這可藉由指定透過組態專案傳送 <system.net> 電子郵件訊息的方式來完成。 如需在 ASP.NET 應用程式中傳送電子郵件訊息的詳細資訊,請參閱在 ASP.NET 和System.Net.Mail 常見問題中傳送Email
  2. 在 元素中 <providers> 註冊電子郵件記錄來源提供者,以及
  3. 將專案新增至 <rules> 專案,以將「所有錯誤」事件對應至步驟 (2) 中所新增的記錄來源提供者。

健康情況監視系統包含兩個電子郵件記錄來源提供者類別: SimpleMailWebEventProviderTemplatedMailWebEventProvider類別 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> 段現在包含兩個規則。 第一個名為「All Errors To Email」,會將所有未處理的例外狀況傳送至 「EmailWebEventProvider」 記錄來源。 此規則會影響將網站上錯誤的詳細資料傳送至指定的收件者位址。 「所有錯誤到資料庫」規則會將錯誤詳細資料記錄到月臺的資料庫。 因此,每當網站上發生未處理的例外狀況時,其詳細資料都會記錄到資料庫,並傳送至指定的電子郵件地址。

圖 2顯示造訪 Genre.aspx?ID=foo 時, SimpleMailWebEventProvider 類別所產生的電子郵件。

顯示電子郵件訊息中傳送詳細資料的螢幕擷取畫面。

圖 2:錯誤詳細資料會在Email訊息中傳送
(按一下即可檢視完整大小的影像)

總結

ASP.NET 健全狀況監視系統的設計目的是要讓系統管理員監視已部署 Web 應用程式的健全狀況。 當特定動作展開時,例如當應用程式停止、使用者成功登入網站或發生未處理的例外狀況時,就會引發健全狀況監視事件。 這些事件可以記錄到任意數目的記錄來源。 本教學課程示範如何將未處理的例外狀況詳細資料記錄到資料庫,以及透過電子郵件訊息。

本教學課程著重于使用健康情況監視來記錄未處理的例外狀況,但請記住,健康情況監視的設計目的是測量已部署 ASP.NET 應用程式的整體健康情況,並包含此處未探索的豐富健康情況監視事件和記錄來源。 更重要的是,您可以建立自己的健康情況監視事件和記錄來源,視需要發生。 如果您有興趣深入瞭解健康情況監視,第一個步驟是閱讀 Erik Reitan的健康 情況監視常見問題。 接下來,請參閱 如何:在 ASP.NET 2.0 中使用健康情況監視

快樂的程式設計!

深入閱讀

如需本教學課程中所討論之主題的詳細資訊,請參閱下列資源: