メインコンテンツにスキップ
モジュール 8 · レッスン 2 / 4コース内の 30/32~12 min
モジュールのレッスン (2/4)

Apacheログパーサー

Apache ログ (結合形式) は正確な構造を持っています。

Code
127.0.0.1 - - [10/Oct/2024:13:55:36 +0000] "GET /index.html HTTP/1.1" 200 1234

名前付きグループ を使用したパターンでは、すべてのフィールドが 1 回のショットで抽出されます。

Code
^(?<ip>\d+\.\d+\.\d+\.\d+)\s+\S+\s+\S+\s+\[[^\]]+\]\s+"(?<metodo>\w+)\s+(?<path>\S+)\s+\S+"\s+(?<status>\d+)\s+(?<size>\d+)

巨大に見えますが、これは単純なパターンを連結したものです。

  • (?<ip>\d+\.\d+\.\d+\.\d+) -- ソース IPv4。
  • \s+\S+\s+\S+ -- ユーザー ID (通常は -)。
  • \[[^\]]+\] -- 角括弧内の日付。
  • "(?<metodo>\w+)\s+(?<path>\S+)\s+\S+" -- HTTP メソッド、パス、バージョンを含む引用符で囲まれたリクエスト。
  • (?<status>\d+)\s+(?<size>\d+) -- ステータス コードと送信されたバイト数。

一般的な戦略

  1. 実際の行から開始し、区切り文字を固定します: スペース、引用符、括弧。
  2. 区切り文字の間で、トークンのタイプ (IP、単語、数値) を識別します。
  3. 抽出する必要があるものだけを 名前付きグループでラップします。

複雑なログの解析

ログ解析では、引用符で囲まれた文字列や括弧 (ユーザー エージェントなど) が含まれる場合を除き、フィールドは通常スペースで区切られます。ワイルドカード ドットの代わりに除外文字クラスを使用すると、複数の列が誤ってマージされるのを防ぐことができます。

試してみてください

運動#regex.m8.l2.e1
試行回数: 0読み込み中…

各ログ行の先頭にある IPv4 を名前付きグループ「ip」として抽出します。

エディターを読み込み中…
ヒントを表示

^ と m フラグを使用して行の先頭にアンカーし、IP を (?<ip>...) で囲みます。

3 回の試行後に解決策が利用可能になります

復習演習

運動#regex.m8.l2.e2
試行回数: 0読み込み中…

HTTP メソッドと引用符間のリクエストのパスをグループ「metodo」と「path」として抽出します。

エディターを読み込み中…
ヒントを表示

「」で開き、次に (?<metodo>\\w+)\\s+(?&lt;パス&gt;\\S+) を指定します。

3 回の試行後に解決策が利用可能になります

追加の課題

運動#regex.m8.l2.e3
試行回数: 0読み込み中…

Extract only the date and time part enclosed in brackets in logs, e.g. `10/Oct/2024:13:55:36 +0000`, as a named group `timestamp`.

エディターを読み込み中…
ヒントを表示

Use \[(?<timestamp>[^\]]+)\] to prevent the engine from matching past the closing bracket.

3 回の試行後に解決策が利用可能になります