7

HttpLogFormatの文字列の正規表現パターンマッチャーを探しています。ログはhaproxyによって生成されます。以下は、この形式のサンプル文字列です。

Feb 6 12:14:14 localhost haproxy[14389]: 10.0.1.2:33317 [06/Feb/2009:12:14:14.655] http-in static/srv1 10/0/30/69/109 200 2750 - - ---- 1/1/1/1/0 0/0 {1wt.eu} {} "GET /index.html HTTP/1.1"

形式の説明は、HttpLogFormatで入手できます。どんな助けでも大歓迎です。

私はその行に含まれる情報の個々の部分を取得しようとしています。フィールドは次のとおりです。

  1. process_name'[' pid']:'
  2. client_ip':' client_port
  3. '[' accept_date']'
  4. frontend_name
  5. backend_name'/' server_name
  6. Tq'/' Tw'/' Tc'/' Tr'/' Tt *
  7. status_code
  8. bytes_read
  9. Captured_request_cookie
  10. Captured_response_cookie
  11. 終了状態
  12. actconn'/' feconn'/' beconn'/'srv_conn'/'再試行
  13. srv_queue'/' backend_queue
  14. '{'captured_request_headers *'}'
  15. '{'captured_response_headers *'}'
  16. '"' http_request'"'
4

5 に答える 5

4

正規表現:

^(\w+ \d+ \S+) (\S+) (\S+)\[(\d+)\]: (\S+):(\d+) \[(\S+)\] (\S+) (\S+)/(\S+) (\S+) (\S+) (\S+) *(\S+) (\S+) (\S+) (\S+) (\S+) \{([^}]*)\} \{([^}]*)\} "(\S+) ([^"]+) (\S+)" *$

結果:

Group 1:    Feb 6 12:14:14
Group 2:    localhost
Group 3:    haproxy
Group 4:    14389
Group 5:    10.0.1.2
Group 6:    33317
Group 7:    06/Feb/2009:12:14:14.655
Group 8:    http-in
Group 9:    static
Group 10:   srv1
Group 11:   10/0/30/69/109
Group 12:   200
Group 13:   2750
Group 14:   -
Group 15:   -
Group 16:   ----
Group 17:   1/1/1/1/0
Group 18:   0/0
Group 19:   1wt.eu
Group 20:   
Group 21:   GET
Group 22:   /index.html
Group 23:   HTTP/1.1

複雑な正規表現を作成するためにRegexBuddyを使用しています。

于 2010-10-30T00:53:40.883 に答える
2

あなた自身の危険で使用してください

これは、アスタリスクでマークしたフィールドを除いて、すべてのフィールドが何かを返すことを前提としています(これはアスタリスクの意味です)。あらゆる種類のネストされた角かっこなどの明らかな失敗のケースもありますが、ロガーが適度に正常なメッセージを出力する場合は、大丈夫だと思います...

もちろん、私でさえこれを維持する必要はありませんが、あなたはそれを持っています。可能であれば、代わりにこのための通常のol'パーサーを作成することを検討することをお勧めします。

編集:これは他の何よりも「これがどうなるのだろうか」という種類の答えであるため、これをCWとしてマークしました。すぐに参照できるように、これは私がrubularで構築することになったものです:

^[^[]+\s+(\w+)\[(\d+)\]:([^:]+):(\d+)\s+\[([^\]]+)\]\s+[^\s]+\s+(\w+)\/(\w+)\s+(\d+)\/(\d+)\/(\d+)\/(\d+)\/(\d*)\s+(\d+)\s+(\d+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s(\d+)\/(\d+)\/(\d+)\/(\d+)\/(\d+)\s+(\d+)\/(\d+)\s+\{([^}]*)\}\s\{([^}]*)\}\s+\"([^"]+)\"$

私の最初のプログラミング言語はPerlでした、そして私でさえ私がそれを恐れていることを認めるつもりです。

于 2010-10-29T20:17:50.170 に答える
1

これは、一致する非常に複雑な文字列のように見えます。Expressoのようなツールを使用することをお勧めします。一致させようとしている文字列から始めて、その一部を正規表現表記に置き換え始めます。

個々のピースを取得するには、グループ化括弧を使用します。

もう1つのオプションは、取得しようとしているピースごとに正規表現を作成することです。

于 2010-10-29T20:07:16.310 に答える
1

なぜ線を正確に一致させようとしているのですか?その中の特定のフィールドを探している場合は、どのフィールドを指定して抽出するかをお勧めします。haproxyログで統計を実行する場合は、ソースの「contrib」ディレクトリにある「halog」ツールを確認する必要があります。バージョン1.4.9のものを使用すると、応答時間でURLを並べ替える方法もわかっています。

しかし、これらの行で何をしたい場合でも、正規表現はおそらく常に最も遅く、最も複雑なソリューションになります。

于 2010-10-29T21:39:43.817 に答える
0

ここでは正規表現が最善の選択肢ではないと思います...ただし、それが唯一の選択肢である場合は...

代わりにこれらのオプションを見てみてください。 https://serverfault.com/q/62687/438

于 2010-10-29T20:26:33.817 に答える