2016-06-28 3 views
1

でGROKにマッチしたパターンの名前を取得するには、次のなどlogstash

A .*foo.* 
B .*bar.* 
C .*baz.* 

と私のGROKフィルタは、次のようになります。

grok { 
    patterns_dir => ["/location/of/patterns"] 
    match => { "request" => [ "%{A}", "%{B}", "%{C}",] 
} 
} 

は、一致するものを知る方法があります。私はSYNTAXの名前です。一致するものの名​​前を文書に注釈したい

+0

groqごとに1つのパターンがあり、add_tagを使用します。 –

答えて

1

あなたが通常行うことは、一致する変数に名前を付けることです。そのための構文は次のようになります。

(あなたの例を取る):

grok { 
    patterns_dir => ["/location/of/patterns"] 
    match => 
    { 
     "request" => [ "%{A:A}", "%{B:NameOfB}", "%{C:SomeOtherName}",] 
    } 
} 

したがって、あなたのGROKの試合は今、次のような名前になります

A:

B:NameOfB

C:SomeOtherName

あなたのケースでは、それらのパターンの後にstの名前。それはうまくいくはずです。

また、(私はgrokデバッガでテストしたところですが)マッチしたパターンに名前をつけないと、パターンの名前がデフォルトになります。これを打ち負かすと、パターンを再利用すると結果は値の配列になります。

これは私が実行されたテストです:

入力:

Caused by: com.my.application.IOException: null Caused by: com.my.application.IOException: null asd asd 

GROK:

(.*?)Caused by:%{GREEDYDATA}:%{GREEDYDATA} 

出力:

{ 
    "GREEDYDATA": [ 
    [ 
     " com.my.application.IOException: null Caused by: com.my.application.IOException", 
     " null asd asd" 
    ] 
    ] 
} 

あなたの問題を解決ホープ

EDITアルトゥール:ここではOPの他の質問に基づいて

は動的にその問題を解決するための私のアプローチです。

あなたはまだ名前に一致する必要があります。あなたのマッチに名前を付ける方法に関する共通の接頭辞を決めてください。 2人工試合、prefix_patternaprefix_patternbがあるか

{"a" : "b", "prefix_patterna" : "", "prefix_patternb" : "bla"} 
{"a" : "b", "prefix_patterna" : "sd", "prefix_patternb" : ""} 

注:私はこれを簡単にするために2つのJSON文字列に私の例をベースにします。だから、私はプレフィックス "プレフィックス"を決めました。そして、それを使って検査するイベントフィールドを特定しました。 (空のイベントをドロップすることもできます)。

ruby { 
    code => " 
     toAdd = nil; 
     event.to_hash.each { |k,v| 
       if k.start_with?('prefix_') && v.to_s != '' 
        toAdd = k 
       end 
     } 
     if toAdd.to_s != '' 
      event['test'] = toAdd 
     end 
    " 
} 

すべてこのコードは、接頭辞のイベントキーをチェックし、かどうかを確認するためにあるん

はその後、私のフィルタでは、私は私のパターンにマッチしたものを見つけるために、すべてのイベントを反復処理するためにルビーを使用しますそのフィールドの値は空またはnilです。値を持つフィールドが見つかると、それを "test"という新しいイベントフィールドに書き込みます。第二の試験は「prefix_patternb」を書き込んながら最初のテストは「prefix_patterna」を書き込む方法

Settings: Default pipeline workers: 8 
Pipeline main started 
{"a" : "b", "prefix_patterna" : "sd", "prefix_patternb" : ""} 
{ 
      "message" => "{\"a\" : \"b\", \"prefix_patterna\" : \"sd\", \"prefix_patternb\" : \"\"}", 
      "@version" => "1", 
     "@timestamp" => "2016-09-15T09:48:29.418Z", 
       "host" => "pandaadb", 
        "a" => "b", 
    "prefix_patterna" => "sd", 
    "prefix_patternb" => "", 
       "test" => "prefix_patterna" 
} 
{"a" : "b", "prefix_patterna" : "", "prefix_patternb" : "bla"} 
{ 
      "message" => "{\"a\" : \"b\", \"prefix_patterna\" : \"\", \"prefix_patternb\" : \"bla\"}", 
      "@version" => "1", 
     "@timestamp" => "2016-09-15T09:48:36.359Z", 
       "host" => "pandaadb", 
        "a" => "b", 
    "prefix_patterna" => "", 
    "prefix_patternb" => "bla", 
       "test" => "prefix_patternb" 
} 

注:ここでは

は私のテストです。

私は次のように複数のGROKフィルタを有することにより、あなたは、試合をタグ(またはフィールドを追加)することができます

アルトゥル

+0

私はフィールドにその結果を新しいフィールドに取り込ませたいと思っています。 例えば、我々は二つの異なる入力だった場合は、上記の私たちは例を見れば: 1)foo_too 2)boo_too パターン:。。 FOO FOO * BOOブーイング* を、私はと呼ばれるフィールドが欲しい「too_type出力が "foo"または "boo"のいずれかに一致するようにします。 例には、共通のフィールド名の代わりにFOO = foo_tooがあり、一致するパターンがあります。例 "too_type" = FOO –

+0

一致するフィールドがフィールド名で、一致するフィールド値がフィールド値の場合は、mutateフィルタを使用してイベントにフィールドを作成し、その両方を参照できます。 – pandaadb

+0

私は様々なパターンのurlリクエストの様々なことを心配しています。req_typeフィールドに、リクエストのタイプを定義する正規表現を注釈してほしい –

0

、これはあなたの問題を解決したいと考えています。

多くの繰り返し(DRYではない)が起こりやすく、複雑なパターン、特にあらかじめ定義されたライブラリパターンの "フラグ"を付ける唯一の方法であるように、スケーラビリティはあまり高くありません。

前のフィルタがすでに一致しているときにも条件付きを実行しないように、後続のフィルタに条件を追加する必要があります。さもなければ、後のフィルターのために_grokparsefailureタグを取得します。 Source

最終的な「else」フィルタ以外のすべての障害タグも削除する必要があります。さもなければあなたは偽の_grokparsefailuresを得るでしょう。 BまたはCがマッチするときAから。 Source

grok { 
    patterns_dir => ["/location/of/patterns"] 
    match => { "request" => "%{A}" 
    add_tag => [ "pattern_A" ] 
    add_field => { "pattern" => "A" } # another option 
    tag_on_failure => [ ] # prevent false failure tags 
} 
if ("pattern_A" not in [tags]) { 
    grok { 
     patterns_dir => ["/location/of/patterns"] 
     match => { "request" => "%{B}" 
     add_tag => [ "pattern_B" ] 
     tag_on_failure => [ ] # prevent false failure tags 
    } 
} 
if (["pattern_A","pattern_B"] not in [tags]) { 
    grok { 
     patterns_dir => ["/location/of/patterns"] 
     match => { "request" => "%{C}" 
     add_tag => [ "pattern_C" ] 
    } 
} 

は簡素化する方法/チューンこれがあるかもしれませんが、私は専門家ではない(まだ!)。

+0

grokのマッチをオプションにすることができますパターンが存在しないときに解析エラーを受け取らない – pandaadb