if条件で一致するLogstash正規表現

if条件で一致するLogstash正規表現

Logstashフィルタリングでは、さまざまなエラー条件に基づいて複数のラベルを設定し、すべてのラベルには「abc:」などの接頭辞があります。

出力でタグに「abc:*」があるかどうかに応じて電子メールを送信したいと思います。

私は文書を読むときにこれを見つけることができませんでした。

ほとんどは次のように書かれています。

[タグ]に「abc」がある場合{......}

しかし、条件が「abc-*」を含むタグと一致したいと思います。どんなアイデアがありますか?

答え1

これをお探しですか(ここでPerl構文)?

s/if\s*\"([^\"]*)\"\s*in\s*\[tags\].*/$1:/g;

abcが単語の場合は、\w代わりに使用できます[^\"]

答え2

@sudobash いいね、前のコメントを更新してください。これは解決策ではなく問題です。この質問を受けてから長い時間が経過したことを知っていますが、後で必要な人がいる場合に備えて、解決策は次のとおりです。


「タグ」フィールドの上にマウスを置くと、そのフィールドが「文字列」フィールドであることがわかります。いいえこれが実際に本当です。公式によると、次のように確認できます。Elasticsearch ドキュメント、フィルタリングには次の条件を使用できます。

equality: ==, !=, <, >, <=, >=
regexp: =~, !~ (checks a pattern on the right against a string value on the left)
inclusion: in, not in

注意を払うと、文字列比較に "regexp"を使用できるはずですが、 "タグ"では機能しないのはなぜですか?答えは、「タグ」が文字列フィールドではないためです。「配列」フィールド/オブジェクト。したがって、すべての比較は配列の特定の位置を指す必要があります。

たとえば、Logstash パイプラインでこのフィルタを使用する場合:

filter {
  if [tags][0] =~ /foo.*/ {
     mutate { add_tag => "worked" }
  }
}

期待どおりに動作します。上記の例では、「タグ」の位置[0]が正規表現条件「foo.*」と一致すると、新しい値(「worked」)がタグ配列に追加されます。

今、実生活では、比較したいラベルが配列のどこにあるのかわからないので、これは役に立たないことを理解しています。そうですか?だから箱からすぐ取り出すと、不可能これを達成するには、ルビーフィルタを使用する必要があります。引用するこの投稿

以下は、前のフィルタ例で行った操作を正確に実行するデフォルトのルビーフィルタです。しかし、今回は動的に実行されます。

filter {
  ruby {
    code => '
        mbool = 0
        event.get("tags").each_index { |x|
          if event.get("tags")[x] =~ /foo.*/
            mbool = 1
          end
        }
        if mbool == 1
          event.tag("ruby-worked")
        end
    '
}

もちろん、最終的に達成しようとする目標によって異なりますが、この記事が役に立つと確信しています。

関連情報