LogstashのKVフィルター設定について

お世話になっております。
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の投稿を検索しましたが、回答が見つからずご教示頂けますと幸いです。

似たような投稿をつい先日も見た気がしますが、
こちらが参考になるのではないでしょうか。

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

区切り文字として使うものとして、本文中に含まれないだろう値を使うとよいと思います。
たとえば、タブ、改行コード、|などの記号です。

mutate {
  gsub => ["message", "(\S+=)", ", \1"]
}

gsubの3つ目の値を見てもらうと、ここで区切り文字としてカンマを使用していることがわかります。
ここを好きな使える区切り文字とすればよいのではないでしょうか。

早急に回答頂きありがとうございます。
追加で確認させて頂いていたのは、
本文中に含まれない値が不明であったため、確認させて頂いた点でもありました。
上記の記載方法を元に検討を進めてみます。
ありがとうございました。
もし、本文中に含まれない値が決められない場合での対応方法があれば、
ご教示頂けると大変助かります。

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される可能性は低くなるかと思います。

ある程度、フォーマットが決まっているものを対象としているのなら、タブ記号などが使えると、シンプルだと思いますが。。。

ご回答ありがとうございました。
ご提示頂きました内容を参考に検討を進めてみます。

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.