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
'
}
もちろん、最終的に達成しようとする目標によって異なりますが、この記事が役に立つと確信しています。