1

Mongrel2 を含むさまざまなログ ソースを管理するために、logstash を構成しようとしています。Mongrel2 で使用される形式はtnetstringで、ログ メッセージは次の形式になります。

86:9:localhost,12:192.168.33.1,5:57089#10:1411396297#3:GET,1:/,8:HTTP/1.1,3:200#6:145978#]

上記のフォーマットから特定のフィールドを抽出するために、独自の grok パターンを作成したいと考えています。上記のメッセージhereで正規表現をテストすることから始めました。正規表現は

^(?:[^:]*\:){2}([^,]*)

これは一致しlocalhostます。フォームで grok パターンと同じ正規表現を使用する場合

TEST ^(?:[^:]*\:){2}([^,]*)
MONGREL %{TEST:test}

でlogstashを構成します

filter {
  grok {
    match => [ "message", "%{MONGREL}" ]
  }
}

同じ正規表現が一致し86:9:localhostます。どこが間違っているのかわかりませんか?テストに使用した正規表現エンジンは Python に基づいていますが、grok フィルターの正規表現は Onigurama に基づいていますか?

現在、次の入力を使用してgrokdebugでテストしています

86:9:localhost,12:192.168.33.1,5:57089#10:1411396297#3:GET,1:/,8:HTTP/1.1,3:200#6:145978#]

そして次のパターン

(?<hostname>^(?:[^:]*\:){2}([^,]*))

その結果

{
  "hostname": [
    [
      "86:9:localhost"
    ]
  ]
}

欲しいところ

{
  "hostname": [
    [
      "localhost"
    ]
  ]
}
4

2 に答える 2

1

http://grokdebug.herokuapp.com/を試してみてください。これは、脱毛を引き起こさない grok パターンをデバッグするための最良の方法です。

于 2014-09-24T13:23:48.267 に答える
1

次のようなパターンは、ホスト名を抽出します。

^(\d+)?:(\d+)?:(?<hostname>[^,]+),

または、すでに書いたのと同様の方法で書きます。

^(?:[^:]*\:){2}(?<hostname>[^,]*)

キャプチャ名は、キャプチャする括弧内にある必要があります...パターンはその時点までのすべてをキャプチャしていました。

于 2014-09-24T13:59:31.510 に答える