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

作者 :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

注意

當我們新增 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 > 元素會指出當「所有錯誤」事件轉譯時,應該使用 「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 摘要檢視錯誤記錄檔。

將事件記錄至 Email

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

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

  1. 設定 ASP.NET Web 應用程式以傳送電子郵件。 這可藉由指定透過 <system.net> 組態專案傳送電子郵件訊息的方式來完成。 如需在 ASP.NET 應用程式中傳送電子郵件訊息的詳細資訊,請參閱在 ASP.NET 中傳送EmailSystem.Net.Mail 常見問題
  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> 段現在包含兩個規則。 第一個名為「所有錯誤至Email」的第一個,會將所有未處理的例外狀況傳送至 「EmailWebEventProvider」 記錄來源。 此規則會影響將網站上錯誤的詳細資料傳送至指定的收件者位址。 「所有錯誤至資料庫」規則會將錯誤詳細資料記錄至月臺的資料庫。 因此,每當網站上發生未處理的例外狀況時,其詳細資料都會記錄到資料庫,並傳送至指定的電子郵件地址。

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

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

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

總結

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

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

快樂的程式設計!

深入閱讀

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