# Logstash 特定データのみをフィールドに指定したい

**URL:** <https://discuss.elastic.co/t/logstash/200780>\
**Category:** 日本語による質問・議論はこちら\
**Created:** [September 24, 2019, 4:58am UTC](https://discuss.elastic.co/t/logstash/200780 "2019-09-24T04:58:36Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![harue](https://avatars.discourse-cdn.com/v4/letter/h/82dd89/32.png) [@harue](https://discuss.elastic.co/u/harue)\
**Post date:** [September 24, 2019, 4:58am UTC](https://discuss.elastic.co/t/logstash/200780/1 "2019-09-24T04:58:36Z")

</div>

Logstashのfilter句にて、  
下記inputデータの「192.168.0.224」のみを「"client\_address" =\> "192.168.0.224"」のようにフィールドを指定したいです。

▼inputデータ  
1286536308.779 180 **192.168.0.224** TCP\_MISS/200 411 GET [http://liveupdate.symantecliveupdate.com/minitri.flg](http://liveupdate.symantecliveupdate.com/minitri.flg) - DIRECT/125.23.216.203 text/plain

本ケースのようにinputデータを **空白区切りで左からn番目の値のみを取り出す** ということが可能なfilterプラグインはありますか？

上記のようなプラグインは存在しない場合、  
Grok filterにて、以下のように記述する方法が良いでしょうか？

```
filter {
 grok {
   match => {
     "message" => "%{NUMBER:timestamp}%{SPACE}%{NUMBER:duration}\s%{IP:client_address}%{GREEDYDATA:rest}"
    }
   remove_field => ["message", "timestamp","duration"]
  }
}

```

もし分かる方がいらっしゃいましたら、回答を宜しくお願い致します。

---

<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:** [September 24, 2019, 7:41am UTC](https://discuss.elastic.co/t/logstash/200780/2 "2019-09-24T07:41:49Z")

</div>

指定文字列で文字列を分割して、n番目の要素を取得する、ということでしたら  
mutateのsplitが使えるかと思います。

```ruby

filter {
    mutate {
        # messageを空白文字で分割する
        split => ["message", " "]
        # n番目の要素、ここでは2番目をclient_addressにセットする
        add_field => { "client_address" => "%{[message][2]}" }
        # 元のmessageを消す
        remove_field => ["message"]
    }
}

```

確認環境: Logstash7.3.2

もちろんGrok Filterも使えるかと思います。

---

<div class="post-metadata">

**Author:** ![harue](https://avatars.discourse-cdn.com/v4/letter/h/82dd89/32.png) [@harue](https://discuss.elastic.co/u/harue)\
**Post date:** [September 25, 2019, 7:25am UTC](https://discuss.elastic.co/t/logstash/200780/3 "2019-09-25T07:25:44Z")

</div>

早急に回答頂きありがとうございます。  
mutateのsplitが使えるのですね。勉強になりました。

【追加のご質問】  
filter句にmutate＋translateの記載を行い、Elasticsearchにてindex登録を行ったところ、  
"client\_address"の値がinputデータの「192.168.0.224」ではなく「%{[message2][2]}」で登録されました。  
add\_field =\> { "client\_address" =\> "%{[message][2]}" }の記載に誤りがありますでしょうか。  
もし分かりましたら教えてください。

Logstashバージョン：7.3.1

▼Logstashのconfig  
input {  
beats {  
…  
}  
}

```
filter{
    mutate {
        split => ["message", " "]
        add_field => { "client_address" => "%{[message][2]}" }
        remove_field => ["message"]
    }

    translate {
        field => "client_address"
        destination => "blacklist"
        exact => true
        regex => true
        dictionary_path => "/var/tmp/data/translate.yml"
        fallback => "2"
  }

}
output{
    elasticsearch{
 …
}
```

---

<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:** [September 25, 2019, 1:26pm UTC](https://discuss.elastic.co/t/logstash/200780/4 "2019-09-25T13:26:46Z")

</div>

Logstash7.3.1( + OpenJDK11 ) で確認しましたが、その書き方で期待した動作になったので、書き方はあってるかと思います。

一方、message[2]が取得できないような場合に、おっしゃるような状況になります。  
一度、remove\_field =\> ["message"]の部分を外して、状況がおきるときのmessageの中身を確認いただくことはできますか？

問題の単純化のために、入力と出力をstdinとstdoutにしてLogstashを動かしてみると良いと思います。

```auto
input {
    stdin{}
}

filter {
    mutate {
        split => ["message", " "]
        add_field => { "client_address" => "%{[message][2]}" }
        # remove_field => ["message"]
    }
}

output {    
    stdout { }
}

```

この状態で、一番最初の投稿にあったような文字を標準入力で入れますと、こうなるかと思います。

> 1286536308.779 180 **192.168.0.224** TCP\_MISS/200 411 GET [http://liveupdate.symantecliveupdate.com/minitri.flg](http://liveupdate.symantecliveupdate.com/minitri.flg) - DIRECT/125.23.216.203 text/plain

 ![image](https://us1.discourse-cdn.com/elastic/original/3X/5/9/596140092bdb043d51ef4dbe9295e22c783c78b2.png)

もし、messageが空白を含まない文字、あるいはSplitできるけど、2番目の要素がないようなときは、こうなりました。

![image](https://us1.discourse-cdn.com/elastic/original/3X/b/2/b28e89d8d0b86081b8a644179e2a814f1c5f9a74.png)

ですので、messageをremoveしているところを、いったん外していただいて、  
Splitが期待通りされていること、指定する要素番号が存在することを確認いただくのが良いのではないかと思います。

ご確認いただければ幸いです。

---

<div class="post-metadata">

**Author:** ![harue](https://avatars.discourse-cdn.com/v4/letter/h/82dd89/32.png) [@harue](https://discuss.elastic.co/u/harue)\
**Post date:** [September 26, 2019, 12:20am UTC](https://discuss.elastic.co/t/logstash/200780/5 "2019-09-26T00:20:32Z")

</div>

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

上記記載で試したところ、"client\_address"に期待の値を取得できました。  
大変助かりました。

---

<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:** [October 24, 2019, 12:20am UTC](https://discuss.elastic.co/t/logstash/200780/6 "2019-10-24T00:20:39Z")

</div>

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