Logstash Grokフィルターを使用するのに最適なアプローチは何かと思います。特定のログエントリ用のフィルタがいくつかありますが、すべてのエントリに適用されるわけではありません。適用されないものは、常に_grokparsefailureタグを生成します。たとえば、ログエントリごとに1つのgrokフィルターがあり、正常に機能します。次に、トレースバック付きのエラーメッセージ用の別のフィルターがあります。トレースバックフィルターは、トレースバックを持たないログエントリごとにgrokparsefailureをスローします。
Parsefailureタグを追加する代わりに、一致しない場合にルールを渡すようにしたいです。 parsefailureタグを使用して、特定のフィルターに単に一致しなかったものではなく、適切に解析されていないものを見つけます。たぶんそれは私を取得する命名法「解析失敗」です。私にとっては、フィルターに何か問題がある(たとえば、フォーマットが不適切である)ことを意味します。一致しなかったことではありません。
質問は、これをどのように処理すればよいですか?
?を使用してフィルターパターンをオプションにします。
(ab)何も設定しないでtag_on_failureオプションを使用する[]
「メッセージ内のトレースバックの場合」のようなものを使用してフィルターを条件付きにします
私が検討していない他の何か?
前もって感謝します。
[〜#〜] edit [〜#〜]
フィルターの周りに条件を追加するパスを取りました:
if [message] =~ /took\s\d+/ {
grok {
patterns_dir => "/etc/logstash/patterns"
match => ["message", "took\s+(?<servicetime>[\d\.]+)"]
add_tag => [ "stats", "servicetime" ]
}
}
それでもフィードバックに興味があります。ここで「ベストプラクティス」と見なされるものは何ですか?
可能であれば、使用しているものと同じように 条件付きラッパー を使用します。回答として自由に投稿してください!
アプリケーションがいくつかの異なる行形式のみを生成する場合、 grok filter で複数の一致パターンを使用できます。デフォルトでは、フィルターは最初に成功した一致まで処理します。
grok {
patterns_dir => "./patterns"
match => {
"message" => [
"%{BASE_PATTERN} %{EXTRA_PATTERN}",
"%{BASE_PATTERN}",
"%{SOME_OTHER_PATTERN}"
]
}
}
ロジックがそれほど単純でない場合(同じ条件を複数回チェックする必要があるかもしれません)、 grep filter はタグを追加するのに役立ちます。このようなもの:
grep {
drop => false #grep normally drops non-matching events
match => ["message", "/took\s\d+/"]
add_tag => "has_traceback"
}
...
if "has_traceback" in [tags] {
...
}
次のように、grookスタンザにtag_on_failure => []
を追加することもできます。
grok {
match => ["context", "\"tags\":\[%{DATA:apptags}\]"]
tag_on_failure => [ ]
}
grokは引き続き失敗しますが、タグ配列に追加せずに失敗します。
これが最も効率的な方法です。フィルターを無視する
filter {
grok {
match => [ "message", "something"]
}
if "_grokparsefailure" in [tags] {
drop { }
}
}
これもできます
remove_tag => ["_grokparsefailure"]
試合があるときはいつでも。