na_taka
November 30, 2021, 9:01am
1
お世話になっております。
logstashのフィルター設定についてご質問です。
サンプルログ(valueにスペースが存在するデータ)
key3=value3 key4=val ue4 key5=value5 key6=val ue6
以下のようにkvフィルターを使用しています。
filter {
kv {
source => "message"
field_split => " "
value_split => "="
}
}
現状:
field名 value
key3 value3
key4 val
key5 value5
key6 val
期待値:
field名 value
key3 value3
key4 val ue4
key5 value5
key6 val ue6
上記データをlogstashのフィルター設定で処理する方法はありますでしょうか。
elastic discussの投稿を検索しましたが、回答が見つからずご教示頂けますと幸いです。
tsgkdt
(tsgkdt)
November 30, 2021, 3:22pm
2
似たような投稿をつい先日も見た気がしますが、
こちらが参考になるのではないでしょうか。
Hello,
I've got a log that seems a perfect candidate for the kv filter:
msg=Start MID 1242272 ICID 1632662 categorySignificance=/Informational catdt=Web Filtering categoryObject=/Host/Application/Service deviceSeverity=Info rt=1582506453000
and so on ...
but, as you can see, there are values that contain space(s).
The first field, for example, is msg and should contain Start MID 1242272 ICID 1632662, but the filter simply stops at the first space, as for the catdt field, giving:
{
…
kvで処理する前に、mutateのgsubで区切り文字を違う文字にすることで、kvで処理しやすくしています。上記のリンク先の例では、区切り文字としてカンマを指定しています。
key3=value3 key4=val ue4 key5=value5 key6=val ue6
↓ mutate/gsubで 区切り文字を追加してやる
key3=value3 , key4=val ue4 , key5=value5 , key6=val ue6
ここまで処理できれば、あとはkvで処理できるかと思います。
早急に回答頂きありがとうございます。
上記の記載方法で実現できるのですが、
追加のご質問で恐縮ですが
サンプルログ(valueにスペース及びカンマが存在するデータ)についても
対応させたいと考えております。ご教示頂けますと幸いです。
key3=va,lue3 key4=val, ue4 key5=value5 key6=val ,ue6
field名 value
key3 va,lue3
key4 val, ue4
key5 value5
key6 val ,ue6
tsgkdt
(tsgkdt)
December 3, 2021, 12:00am
4
区切り文字として使うものとして、本文中に含まれないだろう値を使うとよいと思います。
たとえば、タブ、改行コード、|などの記号です。
mutate {
gsub => ["message", "(\S+=)", ", \1"]
}
gsubの3つ目の値を見てもらうと、ここで区切り文字としてカンマを使用していることがわかります。
ここを好きな使える区切り文字とすればよいのではないでしょうか。
早急に回答頂きありがとうございます。
追加で確認させて頂いていたのは、
本文中に含まれない値が不明であったため、確認させて頂いた点でもありました。
上記の記載方法を元に検討を進めてみます。
ありがとうございました。
もし、本文中に含まれない値が決められない場合での対応方法があれば、
ご教示頂けると大変助かります。
tsgkdt
(tsgkdt)
December 7, 2021, 3:41am
6
kvフィルターでは、1つの文字だけではなく、複数の文字からなる文字列をSplitするものとして指定できます。
To split fields on a regex character that need escaping like the plus sign k1=v1++k2=v2++k3=v3++k4=v4:
filter { kv { field_split_pattern => "\+\+" } }
上記は+記号を2つ重ねたものを指定していますが、
本文中に含まれないだろう値は、複数の文字列を組み合わせればある程度実現できるのではないでしょうか。
ですので、たとえば、|____ASDF____|
のような文字列が区切りとなるように、
最初のgsubでの置換を指定すれば、余計な箇所でSplitされる可能性は低くなるかと思います。
ある程度、フォーマットが決まっているものを対象としているのなら、タブ記号などが使えると、シンプルだと思いますが。。。
na_taka
December 16, 2021, 2:20am
7
ご回答ありがとうございました。
ご提示頂きました内容を参考に検討を進めてみます。
system
(system)
Closed
January 13, 2022, 2:20am
8
This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.