IIS の高度なログ記録 - ログのフィルター処理
作成者: Bobby Videna
IIS 詳細ログのログ フィルタリングを使用すると、管理者はすべての Web サイト トラフィックをキャプチャして、すべてのデータを調べて必要なものを見つける代わりに、関心のある Web サイト トラフィック情報のみを収集できます。 たとえば、Web サイト管理者は、使用できなくなったコンテンツを指す要求がサイトに存在するかどうかを把握する必要がある場合があります。 これらの要求が状態コード '404' を返すことがわかっているため、管理者は、'Status' = '404' の要求のみをキャプチャするログ定義のフィルターを作成できます。 これで、管理者は目的のデータのみを含むログ ファイルを確認できます。
管理者はフィルター処理方法を使用して、異なるログ定義を作成して異なるデータを収集し、ログ データを管理できます。 前の例に戻ると、管理者は、'404' 応答のみをキャプチャするログ定義、'400' 応答のみをキャプチャする別のログ定義、さらに '500' 応答のみをキャプチャする別のログ定義を作成できます (これらが関心のある応答である場合)。 ここで注意すべき重要な点は、関心のないデータをキャプチャしないことで、莫大な量のログ データを削減し、ログ ファイルを簡単に操作できるようになることです。
要件
このチュートリアルでは、高度なログ機能を使用したカスタム ログに関する基本的な知識があることを前提としています。 概要については、「IIS の高度なログ記録 - カスタム ログ」をご覧ください。
ログ定義の複製
このチュートリアルでは、高度なログ機能を使用したログ定義の作成に関する基本的な知識があることを前提としており、IIS マネージャー ユーザー インターフェイス (UI) でのフィルターの作成のみに重点を置いています。 このチュートリアルでは、新しいログ定義を作成しません。 代わりに、既定のログ定義を複製し、複製されたログ定義のフィルターを作成します。 ログ定義を複製すると、このチュートリアルで使用できる基本的なログ定義が生成されます。新しいログ定義ごとに各フィールド セットを再選択する必要はありません。
ログ定義を複製するには、次の操作を行います。
- IIS マネージャーを開きます (スタート>[管理ツール]>[インターネット インフォメーション サービス (IIS) マネージャー] をクリックします)。
- IIS マネージャーの [接続] 画面で、[Default Web Site]\(既定の Web サイト\) レベルの詳細ログ機能を開きます。
- [詳細ログ] 機能のページで、既定のログ定義 (%COMPUTERNAME%-Server) を選択し、[操作] ウィンドウで、[ログ定義の複製] クリックします。
- [ログ定義の複製] ダイアログ ボックスの [New log definition name]\(新しいログ定義名\) に「%COMPUTERNAME%-FilterExample」と入力し、[OK] をクリックします。
次の図に示すように、[詳細ログ] 機能ページに新しいログ定義「%COMPUTERNAME%-FilterExample」が表示されます。
このログ定義は、ログ フィルターの作成方法について説明する以降のセクションで使用します。
単純なフィルターの作成
このセクションでは、前のセクションで作成した %COMPUTERNAME%-FilterExample ログ定義の単純なフィルターを作成する方法について説明します。これにより、静的な HTML ファイルの要求がログに記録されます。 HTML ファイルには .htm または .html のファイル名拡張子があり、この情報 (URI ステム) を含む唯一のログ フィールドにも仮想パスとファイル名が含まれているため、設定が複雑になる可能性があります。 この問題を解決するために、高度なログ機能で正規表現を使用して、URI ステムのログ フィールドでパターン マッチを実行する方法を示します。
使用する正確な正規表現は「.*\.html?」です。 最初の文字 (.) は、\r と \n を除く任意の文字に一致します。 2 番目の文字 (*) は、前の文字の 0 回以上の繰り返しです。 実際には、最初の 2 文字は任意の長さの任意の文字列に一致し、仮想パスとファイル名の一致の問題を解決します。
次に、目的のファイル名拡張子 (.htm と .html) について検討します。 (.) 文字は、正規表現の予約文字ですが、ここではリテラル値が必要です。 そのため、バックスラッシュ記号 (\) を使用して、それに続く (.) をエスケープし、(.) を文字として一致させるようにします。 文字「html」も、文字として一致させます。 最後に、疑問符文字 (?) は、その前の文字 (l) を省略可能にし、文字 .html または .htm を一致させます。
ニーズに合った正規表現を構築する方法の詳細については、「正規表現」でインターネット検索を行い、このテーマについて詳しく調べることをお勧めします。
ファイル名拡張子が .html または .htm の要求のみをキャプチャするフィルターを作成するには、次の操作を行います。
[詳細ログ] 機能のページで、%COMPUTERNAME%-FilterExample ログ定義を選択し、[操作] ウィンドウで、[ログ定義の編集] をクリックします。
[ログ定義] 機能ページの下部にある [フィルター] 領域で、[フィルターの編集] をクリックします。
[Edit Log Definition Filter]\(ログ定義フィルターの編集\) ダイアログ ボックスで、階層リストのルート ノードを選択し ([Condition: AND]\(条件: AND\))、[Add Expression]\(式の追加\) をクリックします。
ダイアログ ボックスの [Expression]\(式\) 領域で、式について次の値を指定します。
- Fieldにする必要があります。 [URI-Stem]\(URI ステム\) を選択します。
- 演算子。 [Equals]\(等しい\) を選択します。
- 値。 「.*\.html?」を入力します。
- [Enable as regular expression]\(正規表現を有効にする\)。 このチェック ボックスをオンにすると、詳細ログで値を Regex 式として扱うように指定できます。
ダイアログ ボックスで [OK] をクリックし、[操作] ウィンドウで [適用] をクリックして、ログ定義に変更を保存します。
複数の式を含むフィルターの作成
ログ フィルターが役立つもう 1 つの例は、正常に処理されなかった要求のみをキャプチャすることです。 おそらく、要求の大部分が成功し、状態コード '200' が返されますが、'400' (無効な要求)、'404' (ファイルが見つかりません)、'500' (内部サーバー エラー) などのエラー条件を返す要求を見つけようとすると、ログ ファイルに多くのノイズが発生する可能性があります。 このセクションでは、複数の式を使用して、状態コードが '400'、'404'、'500' の要求のみをキャプチャするログ定義のフィルターを作成する方法について説明します。
このフィルターを作成するには、次の操作を行います。
「ログ定義の複製」の手順を使用して、%COMPUTERNAME%-FilterExample_MultipleRequests という名前の新しいログ定義を作成します。
[詳細ログ] 機能のページで、%COMPUTERNAME%-FilterExample_MultipleRequests ログ定義を選択し、[操作] ウィンドウで、[ログ定義の編集] をクリックします。
[ログ定義] 機能ページの下部にある [フィルター] 領域で、[フィルターの編集] をクリックします。
[Edit Log Definition Filter]\(ログ定義フィルターの編集\) ダイアログ ボックスで、階層リストのルート ノードを選択し ([Condition: AND]\(条件: AND\))、[Condition]\(条件\) 領域で [OR Condition]\(OR 条件\) を選択し、[Add Expression]\(式の追加\) をクリックします。
一覧にある元のルート ノード ([Condition: AND]\(条件: AND\)) は、[Condition]\(条件\) 領域で [OR Condition]\(OR 条件\) を選択すると、[Condition: OR]\(条件: OR\) に変わります。
ダイアログ ボックスの [Expression]\(式\) 領域で、式について次の値を指定します。
- Fieldにする必要があります。 [Status]\(状態\) を選択します。
- 演算子。 [Equals]\(等しい\) を選択します。
- 値。 「404」と入力します。
- [Enable as regular expression]\(正規表現を有効にする\)。 このチェック ボックスをオフにすると、詳細ログで値をリテラル式として扱うように指定できます。
一覧でルート ノード ([Condition: OR]\(条件: OR\)) を選択し、[Add Expression]\(式の追加\) をクリックします。
別の式ノードがリストに追加されます。 ダイアログ ボックスの [Expression]\(式\) 領域で、式について次の値を指定します。
- Fieldにする必要があります。 [Status]\(状態\) を選択します。
- 演算子。 [Equals]\(等しい\) を選択します。
- 値。 「400」と入力します。
- [Enable as regular expression]\(正規表現を有効にする\)。 このチェック ボックスをオフにすると、詳細ログで値をリテラル式として扱うように指定できます。
一覧でルート ノード ([Condition: OR]\(条件: OR\)) を選択し、[Add Expression]\(式の追加\) をクリックします。
3 つ目の「式」ノードがリストに追加されます。 ダイアログ ボックスの [Expression]\(式\) 領域で、式について次の値を指定します。
- Fieldにする必要があります。 [Status]\(状態\) を選択します。
- 演算子。 [Equals]\(等しい\) を選択します。
- 値。 「500」と入力します。
- [Enable as regular expression]\(正規表現を有効にする\)。 このチェック ボックスをオフにすると、詳細ログで値をリテラル式として扱うように指定できます。
ダイアログ ボックスで [OK] をクリックし、[操作] ウィンドウで [適用] をクリックして、ログ定義に変更を保存します。
複数の条件を含むフィルターの作成
条件は、さまざまな式を連結する動詞です。 既定では、すべての式が 1 つのルート ノード条件の下に表示されます。 最初の例のように式が 1 つだけの場合、ルート ノードの条件は無視されます。 ただし、複数の式がある場合、ルート ノードの条件によって、フィルターが排他的か (条件: AND)、または包括的か (条件: OR) が決まります。 既定では、ルート ノードの条件は AND ([Condition: AND]\(条件: AND\)) ですが、2 番目の例では、OR ([Condition: OR]\(条件: OR\)) に変更する方法を確認しました。
このセクションでは、複数の条件に基づいて要求をキャプチャする、ログ定義のフィルターを作成する方法について説明します。 このセクションの例では、無効な要求をすべてキャプチャし、静的な HTML および ASP/ASP.NET ファイル名拡張子に限定するフィルターを示します。 前のセクションの例を使用して、無効な要求をキャプチャするフィルター部分を作成し、最初の例を使用して、目的のファイル名拡張子をキャプチャするフィルター部分を作成します。 (ASP ファイル名拡張子は .asp で、ASP.NET ファイル名拡張子は .aspx であることにご注意ください。そのため、最初の例で使用した正規表現の値を .*\.aspx? に変更する必要があります)。
適切な条件を使用する必要があります。 大まかに見ると、フィルターは 'STATUS=X' AND 'EXTENSION=Y' のようにする必要があります。 詳細に見ると、'STATUS=X' は ('Status'='400' OR 'Status'='404' OR 'Status'='500') に展開でき、EXTENSION=Y' は ('URI-Stem'='.*\.html?'OR 'URI-Stem'='.*\.aspx?') に展開できます。 完全なフィルターは、('Status'='400' OR 'Status'='404' OR 'Status'='500') AND ('URI-Stem'='.*\.html?'OR 'URI-Stem'='.*\.aspx?') のようになります
複数の条件と複数の式を使用するログ定義の複雑なフィルターを作成するには、次の操作を行います。
「ログ定義の複製」の手順を使用して、%COMPUTERNAME%-FilterExample_Conditions という名前の新しいログ定義を作成します。
[詳細ログ] 機能のページで、%COMPUTERNAME%-FilterExample_Conditions ログ定義を選択し、[操作] ウィンドウで、[ログ定義の編集] をクリックします。
[ログ定義] 機能ページの下部にある [フィルター] 領域で、[フィルターの編集] をクリックします。
[Edit Log Definition Filter]\(ログ定義フィルターの編集\) ダイアログ ボックスで、階層リストのルート ノードを選択し ([Condition: AND]\(条件: AND\))、[Add Condition]\(条件の追加\) をクリックします。
サブノード条件は、一覧のルート ノード条件 ([Condition: AND]\(条件: AND\)) の下に追加されます。 ダイアログ ボックスの [Condition]\(条件\) 領域で、[OR Condition]\(OR 条件\) を選択し、[Add Expression]\(式の追加\) をクリックします。
ダイアログ ボックスの [Expression]\(式\) 領域で、式について次の値を指定します。
- Fieldにする必要があります。 [URI-Stem]\(URI ステム\) を選択します。
- 演算子。 [Equals]\(等しい\) を選択します。
- 値。 「.*\.html?」を入力します。
- [Enable as regular expression]\(正規表現を有効にする\)。 このチェック ボックスをオンにすると、詳細ログで値を Regex 式として扱うように指定できます。
一覧でサブノード条件 ([Condition: OR]\(条件: OR\)) を選択し、[Add Expression]\(式の追加\) をクリックします。
ダイアログ ボックスの [Expression]\(式\) 領域で、式について次の値を指定します。
- Fieldにする必要があります。 [URI-Stem]\(URI ステム\) を選択します。
- 演算子。 [Equals]\(等しい\) を選択します。
- 値。 「.*\.aspx?」と入力します。
- [Enable as regular expression]\(正規表現を有効にする\)。 このチェック ボックスをオンにすると、詳細ログで値を Regex 式として扱うように指定できます。
ここで、階層リストのルート ノード条件 ([Condition: AND]\(条件: AND\)) を選択し、[Add Condition]\(条件の追加\) をクリックします。
2 番目のサブノード条件は、一覧のルート ノード条件 ([Condition: AND]\(条件: AND\)) の下に追加されます。 ダイアログ ボックスの [Condition]\(条件\) 領域で、[OR Condition]\(OR 条件\) を選択し、[Add Expression]\(式の追加\) をクリックします。
ダイアログ ボックスの [Expression]\(式\) 領域で、式について次の値を指定します。
- Fieldにする必要があります。 [Status]\(状態\) を選択します。
- 演算子。 [Equals]\(等しい\) を選択します。
- 値。 「400」と入力します。
- [Enable as regular expression]\(正規表現を有効にする\)。 このチェック ボックスをオフにすると、詳細ログで値をリテラル式として扱うように指定できます。
一覧の最後のサブノード条件 ([Condition: OR]\(条件: OR\)) を選択し、[Add Expression]\(式の追加\) をクリックします。
ダイアログ ボックスの [Expression]\(式\) 領域で、式について次の値を指定します。
- Fieldにする必要があります。 [Status]\(状態\) を選択します。
- 演算子。 [Equals]\(等しい\) を選択します。
- 値。 「404」と入力します。
- [Enable as regular expression]\(正規表現を有効にする\)。 このチェック ボックスをオフにすると、詳細ログで値をリテラル式として扱うように指定できます。
一覧の最後のサブノード条件 ([Condition: OR]\(条件: OR\)) を選択し、[Add Expression]\(式の追加\) をクリックします。
ダイアログ ボックスの [Expression]\(式\) 領域で、式について次の値を指定します。
- Fieldにする必要があります。 [Status]\(状態\) を選択します。
- 演算子。 [Equals]\(等しい\) を選択します。
- 値。 「500」と入力します。
- [Enable as regular expression]\(正規表現を有効にする\)。 このチェック ボックスをオフにすると、詳細ログで値をリテラル式として扱うように指定できます。
ダイアログ ボックスで [OK] をクリックし、[操作] ウィンドウで [適用] をクリックして、ログ定義に変更を保存します。
まとめ
このチュートリアルでは、1 つの式を使用して単純なフィルターを作成する方法と、複数の式と複数の条件で構成されるより複雑なフィルターを作成する方法について説明しました。 その過程で、正規表現を使用して文字列値に対してパターン マッチを実行する方法と、既存のログ定義を複製して新しいログ定義を作成する方法についても説明しました。
これで、ログからの適切な情報の抽出が大幅に扱いやすくなることを願っています。