HTTP API でのエラー ログ記録

この記事では、HyperText Transfer Protocol (HTTP) アプリケーション プログラミング インターフェイス (API) のエラー ログ機能について説明します。

元の製品バージョン:Windows Server 2008 R2、Windows Server 2008、Windows Server 2012 R2、Windows Server 2012、Windows 10、Windows 8.1
元の KB 番号: 820729

概要

HTTP ベースのアプリケーションで発生するエラーの一部は、処理のためにアプリケーションに返されるのではなく、HTTP API によって自動的に処理されます。 このようなエラーの頻度が発生すると、イベント ログまたはアプリケーション ハンドラーがあふれる可能性があるため、この動作が発生します。

次のトピックでは、HTTP API エラー ログのさまざまな側面について説明します。

  • HTTP API エラー ログを構成する
    レジストリ設定は、HTTP API ログ エラー、許可されるログ ファイルの最大サイズ、およびログ ファイルの場所を制御します。

  • HTTP API エラー ログの形式
    HTTP API は、World Wide Web Consortium (W3C) ログ ファイル規則に従ってログ ファイルを作成します。 標準ツールを使用して、これらのログ ファイルを解析できます。 ただし、W3C ログ ファイルとは異なり、HTTP API ログ ファイルには列名は含まれません。

  • HTTP API がログに記録するエラーの種類
    HTTP API では、多くの一般的なエラーがログに記録されます。

次のメソッドでは、HTTP API エラー ログの解決について説明します。

HTTP API エラー ログを構成する

HTTP \Parameters キーの下の 3 つのレジストリ値によって、HTTP API エラー ログが制御されます。 これらのキーは、レジストリ キーにあります。 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters

注:

構成値の場所と形式は、以降のバージョンの Windows オペレーティング システムで変更される可能性があります。

レジストリ値を変更したり、ログ ファイルとそれを含むフォルダーを表示または変更したりするには、管理者/ローカル システムの資格情報が必要です。

レジストリ値の構成情報は、HTTP API ドライバーの起動時に読み取られます。 そのため、設定を変更する場合は、停止してからドライバーを再起動して新しい値を読み取る必要があります。 これを行うには、次のコンソール コマンドを入力します。

net stop http
net start http

次の名前付け規則を使用して、ログ ファイルに名前を付けます。
httperr + シーケンス番号 + .log
例: httperr4.log

ログ ファイルは、ErrorLogFileTruncateSize レジストリ値が指定する最大サイズに達すると循環されます。 この値は 1 メガバイト (MB) 未満にすることはできません。

エラー ログの構成が有効でない場合、または HTTP API がログ ファイルに書き込んでいる間に何らかの障害が発生した場合、HTTP API はイベント ログを使用して、エラー ログが発生していないことを管理者に通知します。

次の表では、レジストリ構成の値について説明します。

レジストリ値 説明
EnableErrorLogging エラー ログを有効にするには TRUE に、無効にするには FALSE に設定できる DWORD。 既定値は TRUE です。
ErrorLogFileTruncateSize エラー ログ ファイルの最大サイズをバイト単位で指定する DWORD。 既定値は 1 MB (0x100000) です。

指定した値を既定値より小さくすることはできません。
ErrorLoggingDir HTTP API がログ ファイルを格納するフォルダーを指定する String。

HTTP API は、指定したフォルダーにサブフォルダー HTTPERR を作成し、そのログ ファイルをサブフォルダーに格納します。 このサブフォルダーとログ ファイルは、同じアクセス許可設定を受け取ります。 管理者アカウントとローカル システム アカウントにはフル アクセス権があります。 他のユーザーにはアクセス権がありません。

次の例は、レジストリでフォルダーが指定されていない場合の既定のフォルダーです。
%SystemRoot%\System32\LogFiles

ErrorLoggingDir 文字列値は、完全修飾ローカル パスである必要があります。 ただし、 を含 %SystemRoot%めることができます。 ネットワーク ドライブまたはネットワーク共有は使用できません。

HTTP API エラー ログの形式

一般に、HTTP API エラー ログ ファイルの形式は W3C エラー ログと同じですが、HTTP API エラー ログ ファイルには列見出しが含まれていない点が異なっています。 HTTP API エラー ログの各行には、1 つのエラーが記録されます。 フィールドは特定の順序で表示されます。 1 つのスペース文字 (0x0020) によって、各フィールドが前のフィールドから分離されます。 各フィールドでは、スペース文字、タブ、印刷不可の制御文字をプラス記号 (0x002B) で置き換えます。

次の表は、エラー ログ レコード内のフィールドとフィールドの順序を示しています。

フィールド 説明
Date Date フィールドは W3C 形式に従います。 このフィールドは協定世界時 (UTC) に基づいています。 Date フィールドは、常に YYYY-MM-DD の形式で 10 文字です。 たとえば、2003 年 5 月 1 日は 2003-05-01 と表されます。
Time [時間] フィールドは W3C 形式に従います。 このフィールドは UTC に基づいています。 時間フィールドは、MM:HH:SS の形式で常に 8 文字です。 たとえば、午後 5 時 30 分 (UTC) は 17:30:00 と表されます。
クライアント インターネット プロトコル (IP) アドレス 影響を受けるクライアントの IP アドレス。 このフィールドの値は、IPv4 アドレスまたは IPv6 アドレスのいずれかです。 クライアント IP アドレスが IPv6 アドレスの場合は、ScopeId フィールドもアドレスに含まれます。
クライアント ポート 影響を受けるクライアントのポート番号。
サーバー IP アドレス 影響を受けるサーバーの IP アドレス。 このフィールドの値は、IPv4 アドレスまたは IPv6 アドレスのいずれかです。 サーバー IP アドレスが IPv6 アドレスの場合は、ScopeId フィールドもアドレスに含まれます。
サーバー ポート 影響を受けるサーバーのポート番号。
プロトコル バージョン 使用されているプロトコルのバージョン。

接続がプロトコルのバージョンを決定するために十分に解析されていない場合は、空のフィールドのプレースホルダーとしてハイフン (0x002D) が使用されます。

解析されるメジャー バージョン番号またはマイナー バージョン番号が 10 以上の場合、バージョンは HTTP/?.?. としてログに記録されます。
動詞 動詞は、解析された最後の要求がパスを示します。 不明な動詞が含まれていますが、255 バイトを超える動詞は、この長さに切り捨てられます。 動詞が使用できない場合は、空のフィールドのプレースホルダーとしてハイフン (0x002D) が使用されます。
CookedURL + Query URL とその URL に関連付けられているクエリは、疑問符 (0x3F) で区切られた 1 つのフィールドとしてログに記録されます。 このフィールドは、4,096 バイトの長さの制限で切り捨てられます。

この URL が解析された場合 ("cooked")、ローカル コード ページ変換でログに記録され、Unicode フィールドとして扱われます。

ログ記録時にこの URL が解析されていない ("cooked") 場合、Unicode 変換なしで正確にコピーされます。

HTTP API でこの URL を解析できない場合は、空のフィールドのプレースホルダーとしてハイフン (0x002D) が使用されます。
プロトコルの状態 プロトコルの状態を 999 より大きくすることはできません。

要求に対する応答のプロトコルの状態が使用可能な場合は、このフィールドに記録されます。

プロトコルの状態が使用できない場合は、空のフィールドのプレースホルダーとしてハイフン (0x002D) が使用されます。
SiteId このバージョンの HTTP API では使用されません。 プレースホルダー ハイフン (0x002D) は常にこのフィールドに表示されます。
理由フレーズ このフィールドには、ログに記録されるエラーの種類を識別する文字列が含まれています。 このフィールドが空のままになることはありません。
キュー名 要求キュー名です。

次のサンプル 行は、HTTP API エラー ログからの行です。

2002-07-05 18:45:09 172.31.77.6 2094 172.31.77.6 80 HTTP/1.1 GET /qos/1kbfile.txt 503 - ConnLimit  
2002-07-05 19:51:59 127.0.0.1 2780 127.0.0.1 80 HTTP/1.1 GET /ThisIsMyUrl.htm 400 - Hostname  
2002-07-05 19:53:00 127.0.0.1 2894 127.0.0.1 80 HTTP/2.0 GET / 505 - Version_N/S  
2002-07-05 20:06:01 172.31.77.6 64388 127.0.0.1 80 - - - - - Timer_MinBytesPerSecond

HTTP API がログに記録するエラーの種類

HTTP API は、クライアント、接続タイムアウト、孤立した要求、および誤って処理された切断された接続に対するエラー応答をログに記録します。

次の一覧は、HTTP API がログに記録するエラーの種類を示しています。

  • クライアントへの応答
    HTTP API は、最後に受信した要求の解析エラーによって発生する 400 エラーなど、エラー応答をクライアントに送信します。 HTTP API はエラー応答を送信した後、接続を閉じます。

  • 接続のタイムアウト
    HTTP API は接続をタイムアウトします。 接続がタイムアウトしたときに要求が保留中の場合、要求はエラー ログに接続に関する詳細情報を提供するために使用されます。

  • 孤立した要求
    ユーザー モード プロセスは、そのプロセスにルーティングされるキューに登録された要求が残っている間に予期せず停止します。 HTTP API は、孤立した要求をエラー ログに記録します。特定のエラーの種類は、各エラー行の最後のフィールドとして常に表示される Reason Phrase 文字列によって名前が付けられます。 次の表は、HTTP API Reason Phrases を示しています。

理由フレーズ 説明
AppOffline サービス利用不可エラーが発生しました (HTTP エラー 503)。 アプリケーション エラーによってアプリケーションがオフラインになるため、サービスを利用できません。
AppPoolTimer サービス利用不可エラーが発生しました (HTTP エラー 503)。 アプリケーション プール プロセスがビジー状態で要求を処理できないため、サービスは使用できません。
AppShutdown サービス利用不可エラーが発生しました (HTTP エラー 503)。 管理者ポリシーに応答してアプリケーションが自動的にシャットダウンするため、サービスは使用できません。
BadRequest 要求の処理中に解析エラーが発生しました。
Client_Reset クライアントとサーバーの間の接続は、要求をワーカー プロセスに割り当てる前に閉じられました。 この動作の最も一般的な原因は、クライアントがサーバーへの接続を途中で閉じることです。
Connection_Abandoned_By_AppPool アプリケーション プールからのワーカー プロセスが予期せず終了したか、ハンドルを閉じて保留中の要求が孤立しました。
Connection_Abandoned_By_ReqQueue アプリケーション プールからのワーカー プロセスが予期せず終了したか、ハンドルを閉じて保留中の要求が孤立しました。 Windows Vista 以降のバージョンおよび Windows Server 2008 以降のバージョンに固有です。
Connection_Dropped クライアントとサーバーの間の接続は、サーバーが最終的な応答パケットを送信する前に閉じられました。 この動作の最も一般的な原因は、クライアントがサーバーへの接続を途中で閉じることです。
Connection_Dropped_List_Full クライアントとサーバー間の切断された接続の一覧がいっぱいです。 Windows Vista 以降のバージョンおよび Windows Server 2008 以降のバージョンに固有です。
ConnLimit サービス利用不可エラーが発生しました (HTTP エラー 503)。 サイト レベルの接続制限に達したか超えたため、サービスを利用できません。
Connections_Refused カーネル NonPagedPool メモリが 20 MB を下回り、http.sys が新しい接続の受信を停止しました
無効 サービス利用不可エラーが発生しました (HTTP エラー 503)。 管理者がアプリケーションをオフラインにしたため、サービスを利用できません。
EntityTooLarge エンティティが許可されている最大サイズを超えました。
FieldLength フィールドの長さの制限を超えました。
禁止されています 解析中に禁止された要素またはシーケンスが満たされました。
ヘッダー ヘッダーで解析エラーが発生しました。
ホスト名 ホスト名の処理中に解析エラーが発生しました。
内部 内部サーバー エラーが発生しました (HTTP エラー 500)。
Invalid_CR/LF キャリッジ リターンまたはライン フィードが正しくありません。
LengthRequired 必要な長さの値が見つかりませんでした。
該当なし サービス利用不可エラーが発生しました (HTTP エラー 503)。 内部エラー (メモリ割り当てエラーや URL 予約リストの競合など) が発生したため、サービスを使用できません。
N/I 実装されていないエラー (HTTP エラー 501) が発生したか、転送エンコードが不明なため、サービス利用不可エラー (HTTP エラー 503) が発生しました。
番号 数値の処理中に解析エラーが発生しました。
前提 条件 必要な前提条件が見つかりませんでした。
QueueFull サービス利用不可エラーが発生しました (HTTP エラー 503)。 アプリケーション要求キューがいっぱいであるため、サービスは使用できません。
RequestLength 要求の長さの制限を超えました。
Timer_AppPool サーバー アプリケーションがキューを解除して処理するために、アプリケーション プール キューで要求が長すぎるため、接続の有効期限が切れています。 このタイムアウト期間は ConnectionTimeout です。 既定では、この値は 2 分に設定されます。
Timer_ConnectionIdle 接続の有効期限が切れ、アイドル状態のままです。 既定の ConnectionTimeout 期間は 2 分です。
Timer_EntityBody 要求エンティティ本文が到着する前に、接続の有効期限が切れています。 要求にエンティティ本文が明確に含まれている場合、HTTP API はTimer_EntityBody タイマーをオンにします。 最初に、このタイマーの制限は ConnectionTimeout 値 (通常は 2 分) に設定されます。 この要求で別のデータ表示が受信されるたびに、HTTP API はタイマーをリセットして、接続にさらに 2 分 (または ConnectionTimeout で指定されているもの) を提供します。
Timer_HeaderWait 要求のヘッダー解析に既定の制限である 2 分を超える時間がかかったため、接続の有効期限が切れています。
Timer_MinBytesPerSecond クライアントが適切な速度で応答を受信していなかったため、接続の有効期限が切れています。 応答送信レートが、既定の 240 バイト/秒よりも遅かった。MinFileBytesPerSec メタベース プロパティを使用して制御できます。
Timer_ReqQueue サーバー アプリケーションがキューを解除するためにアプリケーション プール キューで要求が長すぎるため、接続の有効期限が切れています。 このタイムアウト期間は ConnectionTimeout です。 既定では、この値は 2 分に設定されます。 Windows Vista 以降のバージョンおよび Windows Server 2008 以降のバージョンに固有です。
Timer_Response 予約済み。 現在使用されていません。
Timer_SslRenegotiation
クライアントとサーバー間の Secure Sockets Layer (SSL) の再ネゴシエーションが、2 分の既定のタイムアウトより長くかかったため、接続の有効期限が切れています。
URL URL の処理中に解析エラーが発生しました。
URL_Length URL が許可される最大サイズを超えました。
動詞 動詞の処理中に解析エラーが発生しました。
Version_N/S サポートされていないバージョンのエラーが発生しました (HTTP エラー 505)。