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

**URL:** <https://discuss.elastic.co/t/logstash-kv/290528>\
**Category:** 日本語による質問・議論はこちら\
**Created:** [November 30, 2021, 9:01am UTC](https://discuss.elastic.co/t/logstash-kv/290528 "2021-11-30T09:01:15Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![na\_taka](https://avatars.discourse-cdn.com/v4/letter/n/e274bd/32.png) [@na\_taka](https://discuss.elastic.co/u/na_taka)\
**Post date:** [November 30, 2021, 9:01am UTC](https://discuss.elastic.co/t/logstash-kv/290528/1 "2021-11-30T09:01:15Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![tsgkdt](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/tsgkdt/32/39151_2.png) [@tsgkdt](https://discuss.elastic.co/u/tsgkdt)\
**Post date:** [November 30, 2021, 3:22pm UTC](https://discuss.elastic.co/t/logstash-kv/290528/2 "2021-11-30T15:22:36Z")

</div>

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

> [@Kv filter with spaces in values](https://discuss.elastic.co/t/kv-filter-with-spaces-in-values/227962):
>
> 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で処理できるかと思います。

---

<div class="post-metadata">

**Author:** ![na\_taka](https://avatars.discourse-cdn.com/v4/letter/n/e274bd/32.png) [@na\_taka](https://discuss.elastic.co/u/na_taka)\
**Post date:** [December 1, 2021, 2:39am UTC](https://discuss.elastic.co/t/logstash-kv/290528/3 "2021-12-01T02:39:11Z")

</div>

早急に回答頂きありがとうございます。

上記の記載方法で実現できるのですが、  
追加のご質問で恐縮ですが  
サンプルログ(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

---

<div class="post-metadata">

**Author:** ![tsgkdt](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/tsgkdt/32/39151_2.png) [@tsgkdt](https://discuss.elastic.co/u/tsgkdt)\
**Post date:** [December 3, 2021, 12:00am UTC](https://discuss.elastic.co/t/logstash-kv/290528/4 "2021-12-03T00:00:18Z")

</div>

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

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

```

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

---

<div class="post-metadata">

**Author:** ![na\_taka](https://avatars.discourse-cdn.com/v4/letter/n/e274bd/32.png) [@na\_taka](https://discuss.elastic.co/u/na_taka)\
**Post date:** [December 3, 2021, 4:16am UTC](https://discuss.elastic.co/t/logstash-kv/290528/5 "2021-12-03T04:16:03Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![tsgkdt](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/tsgkdt/32/39151_2.png) [@tsgkdt](https://discuss.elastic.co/u/tsgkdt)\
**Post date:** [December 7, 2021, 3:41am UTC](https://discuss.elastic.co/t/logstash-kv/290528/6 "2021-12-07T03:41:27Z")

</div>

kvフィルターでは、１つの文字だけではなく、複数の文字からなる文字列をSplitするものとして指定できます。

> **[Kv filter plugin | Logstash Reference \[8.11\] | Elastic](https://www.elastic.co/guide/en/logstash/current/plugins-filters-kv.html#plugins-filters-kv-field_split_pattern)**

> 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 =\> "\+\+" } }

上記は＋記号を２つ重ねたものを指定していますが、  
本文中に含まれないだろう値は、複数の文字列を組み合わせればある程度実現できるのではないでしょうか。

ですので、たとえば、`| ____ASDF____ |`のような文字列が区切りとなるように、  
最初のgsubでの置換を指定すれば、余計な箇所でSplitされる可能性は低くなるかと思います。

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

---

<div class="post-metadata">

**Author:** ![na\_taka](https://avatars.discourse-cdn.com/v4/letter/n/e274bd/32.png) [@na\_taka](https://discuss.elastic.co/u/na_taka)\
**Post date:** [December 16, 2021, 2:20am UTC](https://discuss.elastic.co/t/logstash-kv/290528/7 "2021-12-16T02:20:17Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [January 13, 2022, 2:20am UTC](https://discuss.elastic.co/t/logstash-kv/290528/8 "2022-01-13T02:20:30Z")

</div>

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