イベントログに EventLogWebEventProvider のエラーが記録される現象について (1)


こんにちは d99 です。
今日は、最近良くお問い合わせを頂く現象について紹介させてください。

アプリケーションイベントログに以下のエラーが記録される場合があります。イベントソース、イベント ID、そしてイベントメッセージの “EventLogWebEventProvider” と “0x80070057” が合致するのであれば、この現象です。

イベントの種類: エラー
イベントソース: ASP.NET 2.0.50727.0
イベントカテゴリ: Web イベント
イベント ID: 1301
System.Web.HttpException: EventLogWebEventProvider プロバイダでは、エラー コード 0x80070057 でイベントをログに記録できませんでした。

このイベントは端的に言いますと、「エラーを記録するのに失敗した」 という事を示しています。

ASP.NET 2.0 では、Web アプリケーションで未処理の例外が発生した際に、アプリケーションイベントログにイベントソースを ASP.NET <バージョン番号> としてその例外の詳細を記録するという機能が搭載されており、ヘルスモニタリング機能と呼ばれています。ヘルスモニタリング機能については以前下記で紹介させて頂きました。

ASP.NET 障害解析 最初の一歩
http://technet.microsoft.com/ja-jp/ee862421.aspx

上記のエラーは、このヘルスモニタリング機能が、アプリケーションで発生したエラーをイベントログ記録しようとしたのですが、それに失敗した、という事を示しています。従ってイベントログに記録されているのは、本来のエラーではありません。

イベントログに記録できなかった理由は、Windows Vista/2008 以降で、イベントログへイベントを記録するための API、ReportEvent() 関数の動作が変わり、記録できる最大文字列長が少し短くなってしまったためです。ASP.NET は以前の Windows OS 向けの長さ(32k)に切り詰めて記録しようとし、新しい OS では 32k では長すぎるためにエラーになっています。ASP.NET が最新の OS での動作変更に追従出来ていなかった点について、ASP.NET の問題として報告を行いました。

ReportEvent function
http://msdn.microsoft.com/en-us/library/aa363679(VS.85).aspx

では、本来のエラーはなんだったのか、ですが、実は、ASP.NET がそんなに長いイベントログを記録する状況というのは、ほぼ一つに限られています。それは ViewState の検証エラーです。

ASP.NET が ViewState を検証しようとしてエラーになると、ASP.NET はその ViewState 内容を出来る限りイベントログに記録しようとします。そのため、長い ViewState のページであれば 32k へ切り詰めようとし、そして上記のエラーになります。

少し長くなってきましたので一旦区切り、次回は今回の続きとして ViewState のエラーについて解説させてください。

ではまた。
d99 でした。

Skip to main content