2011-08-10 10 views
3

私はregexの初心者です。異なるTomcatのログエントリの正規表現パターン

私はTomcatのアクセスログファイルから次の行を持っている場合:

123.45.67.89 - - [27/10月/ 2000:09:27:09 -0400] \ "GET /java/javaResources.html HTTP

次のパターンは、まったく同じように見えるエントリでうまく動作します(例:上:

ただし、すべてのログエントリが上記のように表示されるわけではなく、時には9個のフィールドが含まれている場合もあります。 9フィールドエンティティの例:

82.132.139.79 - [2011年7月14日:18:52:44 +0100] "GET /〜roger/cpp/introans.htm HTTP/1.1" 200 11195 "http ://www.dcs.bbk.ac.uk/~roger/cpp/intro3.htm "" Mozilla/5.0(iPhone; U; Mac OS XのようなCPU iPhone OS 4_2_1;私たちは、IP、日付、時刻、およびURLのみに興味があります。AppleWebKit/533.17.9(GeckoのようなKHTML)バージョン/ 5.0.2 Mobile/8C148 Safari/6533.18.5

。 のみにかかわらず、フィールドの数のログエントリからエントリを一致させるための検索パターンがありますか?

+0

9フィールドの例を挙げることはできますか?他の2つのフィールドは何ですか?そしてそれらはどこですか? – NorthGuard

+0

inTideがあります - 他の2つのフィールドの位置やその位置が異なる場合、それらの位置が異なる場所を使用する必要があります。次に、いくつかのフィールドだけに興味がある場合は、気にしないグループで非キャプチャグループ '(?:。*?)'を使います。そして、順番に、あなたは$ 1、$ 2、$ 3を持っています。 – stslavik

答えて

6

あなたが例に与えるラインは、擬似標準combined log formatである。この9フィールド形式が広く使われているcommon log formatを拡張

正規表現で最後の2つのフィールドをオプションにすると、共通形式または結合形式のいずれかで行を一致させることができます。

"^(\\S+) (\\S+) (\\S+) \\[(.*?)\\] \"(.*?)\" (\\S+) (\\S+)(\"(.*?)\" \"(.*?)\")?" 

キャプチャグループは、以下のとおりです。

  1. リモートホスト
  2. RFC 1413のアイデンティティ
  3. ユーザーID
  4. 日時
  5. 要求
  6. 状態
  7. バイト
  8. 任意複合フィールド
  9. リファラ
  10. ユーザエージェント

このパターンは、意図的にログメッセージ内の特定のフィールドの内容に非特異的です。一般的に、ログを解析するときは、仕様の検証を試みるのではなく、できる限り何かを抽出したいと考えています。