Share via


ASP.NET の状態監視でエラーの詳細をログに記録する (C#)

作成者: Scott Mitchell

Microsoft の正常性監視システムでは、ハンドルされない例外を含むさまざまな Web イベントを簡単かつカスタマイズ可能な方法でログに記録できます。 このチュートリアルでは、正常性監視システムを設定して、未処理の例外をデータベースに記録し、電子メール メッセージを介して開発者に通知する方法について説明します。

はじめに

ログ記録は、デプロイされたアプリケーションの正常性を監視し、発生する可能性のある問題を診断するための便利なツールです。 特に、デプロイされたアプリケーションで発生したエラーをログに記録して、エラーを解決することが重要です。 イベントは Error 、ASP.NET アプリケーションで未処理の例外が発生するたびに発生します。 前のチュートリアル では、開発者にエラーを通知し、イベントのイベント ハンドラーを作成してその詳細をログに記録する方法を Error 示しました。 ただし、このタスクは ASP によって実行できるため、エラーの詳細をログに記録して開発者に通知するイベント ハンドラーを作成 Error する必要は不要です。NET の 正常性監視システム

正常性監視システムは、ASP.NET 2.0 で導入され、アプリケーションまたは要求の有効期間中に発生するイベントをログに記録することによって、デプロイされた ASP.NET アプリケーションの正常性を監視するように設計されています。 正常性監視システムによってログに記録されるイベントは、 正常性監視イベント または Web イベントと呼ばれ、次のものが含まれます。

  • アプリケーションの起動または停止などのアプリケーションの有効期間イベント
  • ログイン試行の失敗や URL 承認要求の失敗など、セキュリティ イベント
  • 未処理の例外、ビュー ステート解析例外、要求検証例外、コンパイル エラーなどのアプリケーション エラー。その他の種類のエラーも含まれます。

正常性監視イベントが発生すると、指定した任意の数の ログ ソースにログを記録できます。 正常性監視システムには、Web イベントを Microsoft SQL Server データベース、Windows イベント ログ、または電子メール メッセージなどに記録するログ ソースが付属しています。 独自のログ ソースを作成することもできます。

正常性監視システム ログと使用されるログ ソースのイベントは、 で Web.config定義されます。 数行の構成マークアップを使用すると、正常性監視を使用して、未処理のすべての例外をデータベースに記録し、電子メールで例外を通知できます。

正常性監視システムの構成の確認

正常性監視システムの動作は、 の 要素Web.configにある<healthMonitoring>構成情報によって定義されます。 この構成セクションでは、特に次の 3 つの重要な情報を定義します。

  1. 発生したときにログに記録する必要がある正常性監視イベント。
  2. ログ ソースと
  3. (1) で定義されている各正常性監視イベントが、(2) で定義されているログ ソースにどのようにマップされるか。

この情報は、それぞれ、および <rules>の 3 つの子構成要素<eventMappings><providers>で指定されます。

既定の正常性監視システムの構成情報は、 フォルダー内の 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" が型の正常性監視イベントに割り当てられ、"Failure Audits" という名前が 型WebBaseErrorEventWebFailureAuditEventの正常性監視イベントに割り当てられます。

要素は <providers> ログ ソースを定義し、わかりやすい名前を付け、ログ ソース固有の構成情報を指定します。 最初 <add> の要素は、クラスを使用して指定された正常性監視イベントをログに記録する "EventLogProvider" プロバイダーを EventLogWebEventProvider 定義します。 クラスは EventLogWebEventProvider 、イベントを Windows イベント ログに記録します。 2 番目<add>の要素は、"SqlWebEventProvider" プロバイダーを定義します。このプロバイダーは、 クラスを介して Microsoft SQL Server データベースにイベントをログにSqlWebEventProvider記録します。 "SqlWebEventProvider" 構成では、他の構成オプションの中でもデータベースの接続文字列 (connectionStringName) を指定します。

要素は <rules> 、 要素で指定されたイベントを、 <eventMappings> 要素のログ ソースに <providers> マップします。 既定では、ASP.NET Web アプリケーションは、未処理のすべての例外と監査エラーを Windows イベント ログに記録します。

データベースへのイベントのログ記録

正常性監視システムの既定の構成は、アプリケーションのファイルにセクションWeb.configを追加<healthMonitoring>することで、Web アプリケーションごとにカスタマイズできます。 要素を使用して、<eventMappings>、、および <rules> セクションに追加の要素を<add><providers>めることができます。 既定の構成から設定を削除するには、 要素を使用するか、 を <remove> 使用 <clear /> してこれらのセクションの 1 つからすべての既定値を削除します。 クラスを使用して、未処理のすべての例外を Microsoft SQL Server データベースに記録するように Book Reviews Web アプリケーションをSqlWebEventProvider構成してみましょう。

クラスはSqlWebEventProvider正常性監視システムの一部であり、正常性監視イベントを指定されたSQL Server データベースに記録します。 クラスは SqlWebEventProvider 、指定されたデータベースに という名前 aspnet_WebEvent_LogEventのストアド プロシージャが含まれていることを想定しています。 このストアド プロシージャには、イベントの詳細が渡され、イベントの詳細を格納するタスクが実行されます。 イベントの詳細を格納するために、このストアド プロシージャやテーブルを作成する必要がないようにすることをお勧めします。 ツールを使用して、これらのオブジェクトをデータベースに aspnet_regsql.exe 追加できます。

Note

このツールについては aspnet_regsql.exe 、ASP のサポートを追加した際の Application Services を使用する Web サイトの構成 関するチュートリアルで説明しました。NET のアプリケーション サービス。 したがって、Book Reviews Web サイトのデータベースには、イベント情報を aspnet_WebEvent_LogEvent という名前 aspnet_WebEvent_Eventsのテーブルに格納するストアド プロシージャが既に含まれています。

必要なストアド プロシージャとテーブルをデータベースに追加したら、残っているのは、処理されていないすべての例外をデータベースにログに記録するように正常性監視に指示することです。 これを行うには、Web サイトのファイルに次の 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 />して、、、および <rules> セクションから定義済みの正常性監視構成情報を<eventMappings><providers>ワイプします。 次に、これらの各セクションに 1 つのエントリを追加します。

  • 要素は <eventMappings> 、"すべてのエラー" という名前の対象の 1 つの正常性監視イベントを定義します。これは、ハンドルされない例外が発生するたびに発生します。
  • 要素は <providers> 、 クラスを使用する "SqlWebEventProvider" という名前の単一のログ ソースを SqlWebEventProvider 定義します。 属性は connectionStringName 、セクションで定義されている接続文字列の名前である "ReviewsConnectionString" に <connectionStrings> 設定されています。
  • 最後に、rules> 要素は<、"すべてのエラー" イベントが発生したときに、"SqlWebEventProvider" プロバイダーを使用してログに記録する必要があることを示します。

この構成情報は、正常性監視システムに対して、未処理のすべての例外をブック レビュー データベースに記録するように指示します。

Note

イベントは WebBaseErrorEvent サーバー エラーに対してのみ発生します。見つからない ASP.NET リソースの要求など、HTTP エラーでは発生しません。 これは、サーバーエラーと HTTP エラーの両方で HttpApplication 発生するクラスの Error イベントの動作とは異なります。

正常性監視システムの動作を確認するには、Web サイトにアクセスし、 にアクセスしてランタイム エラーを生成します Genre.aspx?ID=foo。 適切なエラー ページが表示されます。[例外の詳細] [黄色い死の画面] (ローカルにアクセスする場合) またはカスタム エラー ページ (運用環境のサイトにアクセスする場合)。 バックグラウンドで、正常性監視システムはエラー情報をデータベースに記録しました。 テーブルには 1 つのレコードが存在する aspnet_WebEvent_Events 必要があります ( 図 1 を参照)。このレコードには、発生したばかりのランタイム エラーに関する情報が含まれています。

テーブルに記録されるエラーの詳細を示すスクリーンショット。

図 1: エラーの詳細がテーブルに aspnet_WebEvent_Events 記録されました
(クリックするとフルサイズの画像が表示されます)

Web ページでのエラー ログの表示

Web サイトの現在の構成では、正常性監視システムによって、未処理のすべての例外がデータベースに記録されます。 ただし、正常性の監視では、Web ページを介してエラー ログを表示するメカニズムは提供されません。 ただし、データベースからこの情報を表示する ASP.NET ページを作成することもできます。 (一時的に表示されるので、メール メッセージでエラーの詳細を送信するように選択できます)。

このようなページを作成する場合は、承認されたユーザーのみがエラーの詳細を表示できるようにする手順を実行してください。 サイトで既にユーザー アカウントが使用されている場合は、URL 承認規則を使用して、ページへのアクセスを特定のユーザーまたはロールに制限できます。 ログインしているユーザーに基づいて Web ページへのアクセスを許可または制限する方法の詳細については、「 Web サイトセキュリティチュートリアル」を参照してください。

Note

後続のチュートリアルでは、ELMAH という名前の別のエラー ログと通知システムについて説明します。 ELMAH には、Web ページと RSS フィードの両方からエラー ログを表示する組み込みのメカニズムが含まれています。

Emailへのイベントのログ記録

正常性監視システムには、イベントを電子メール メッセージに "ログ記録" するログ ソース プロバイダーが含まれています。 ログ ソースには、電子メール メッセージ本文でデータベースに記録されるのと同じ情報が含まれます。 このログ ソースを使用すると、特定の正常性監視イベントが発生したときに開発者に通知できます。

例外が発生するたびに電子メールを受信できるように、Book Reviews Web サイトの構成を更新しましょう。 これを実現するには、次の 3 つのタスクを実行する必要があります。

  1. 電子メールを送信するように ASP.NET Web アプリケーションを構成します。 これは、構成要素を介して電子メール メッセージを送信する方法を <system.net> 指定することによって実現されます。 ASP.NET アプリケーションで電子メール メッセージを送信する方法の詳細については、「ASP.NET でのEmailの送信」と「System.Net.Mail に関する FAQ」を参照してください
  2. 電子メール ログ ソース プロバイダーを 要素に <providers> 登録し、
  3. 手順 (2) で追加した <rules> ログ ソース プロバイダーに "すべてのエラー" イベントをマップするエントリを 要素に追加します。

正常性監視システムには、2 つの電子メール ログ ソース プロバイダー クラスと TemplatedMailWebEventProviderSimpleMailWebEventProvider含まれています。 クラスはSimpleMailWebEventProvider、イベントの詳細を含むプレーンテキストの電子メール メッセージを送信し、電子メール本文のカスタマイズをほとんど行いません。 クラスでは、TemplatedMailWebEventProviderレンダリングされたマークアップが電子メール メッセージの本文として使用される ASP.NET ページを指定します。 クラスをTemplatedMailWebEventProvider使用すると、電子メール メッセージの内容と形式をより細かく制御できますが、電子メール メッセージの本文を生成する ASP.NET ページを作成する必要がある場合は、もう少し前もって作業する必要があります。 このチュートリアルでは、 クラスの使用に焦点を SimpleMailWebEventProvider 当てます。

ファイル内の正常性監視システムの <providers> 要素を更新して、 Web.config クラスのログ ソースを 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> 電子メール メッセージの To アドレスや From アドレスなど、追加の構成オプションが含まれています。

電子メール ログ ソースを定義した状態で残っているのは、このソースを使用して未処理の例外を "ログ記録" するように正常性監視システムに指示することです。 これは、セクションに新しいルール <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> 2 つのルールが含まれるようになりました。 "すべてのエラーをEmailする" という名前の最初のエラーは、すべての未処理の例外を "EmailWebEventProvider" ログ ソースに送信します。 このルールは、Web サイトのエラーに関する詳細を指定された宛先アドレスに送信する効果があります。 "データベースに対するすべてのエラー" ルールは、エラーの詳細をサイトのデータベースに記録します。 そのため、サイトでハンドルされない例外が発生するたびに、その詳細はデータベースに記録され、指定された電子メール アドレスに送信されます。

図 2 は、 にアクセスするときに クラスによって SimpleMailWebEventProvider 生成された電子メールを Genre.aspx?ID=foo示しています。

電子メール メッセージで送信されたエラーの詳細を示すスクリーンショット。

図 2: エラーの詳細がEmail メッセージで送信される
(クリックするとフルサイズの画像が表示されます)

まとめ

ASP.NET 正常性監視システムは、管理者がデプロイされた Web アプリケーションの正常性を監視できるように設計されています。 正常性監視イベントは、アプリケーションが停止したとき、ユーザーがサイトに正常にログオンしたとき、ハンドルされない例外が発生したときなど、特定のアクションが展開されたときに発生します。 これらのイベントは、任意の数のログ ソースに記録できます。 このチュートリアルでは、ハンドルされない例外の詳細をデータベースと電子メール メッセージでログに記録する方法について説明しました。

このチュートリアルでは、正常性監視を使用して未処理の例外をログに記録することに焦点を当てていますが、正常性の監視は、デプロイされた ASP.NET アプリケーションの全体的な正常性を測定するように設計されており、ここでは調べられていない豊富な正常性監視イベントとログ ソースが含まれていることに注意してください。 さらに、必要に応じて、独自の正常性監視イベントとログ ソースを作成できます。 正常性監視の詳細については、 まず、Erik Reitan正常性監視に関する FAQ を参照することをお勧めします。 その後、「 方法: ASP.NET 2.0 で正常性監視を使用する」を参照してください。

プログラミングに満足!

もっと読む

このチュートリアルで説明するトピックの詳細については、次のリソースを参照してください。