# Aggregateのtask\_idを複数指定したい

**URL:** <https://discuss.elastic.co/t/aggregate-task-id/193923>\
**Category:** 日本語による質問・議論はこちら\
**Created:** [August 6, 2019, 5:27am UTC](https://discuss.elastic.co/t/aggregate-task-id/193923 "2019-08-06T05:27:45Z")\
**Posts on this page:** 4\
**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:** [August 6, 2019, 5:27am UTC](https://discuss.elastic.co/t/aggregate-task-id/193923/1 "2019-08-06T05:27:45Z")

</div>

お世話になっております。  
LogstashのAggregate filterについて質問させて頂きます。

**実現したいこと**  
複数の指定した項目のデータが一致している場合、ログをグループ化

例  
条件：id,hostが両方同じ値であれば、nameをグループ化  
下記の場合、idは同値だがhostが異なる値のため、nameはグループ化されないようにしたい

| id |host | name |  
| 1 |0.0.0.0 |AAA |  
| 1 |1.1.1.1 |BBB |

結果  
| id |host | name |  
| 1 |0.0.0.0 |AAA |  
| 1 |1.1.1.1 |BBB |

**質問**  
上記を実現したいのですが、「task\_id」は1つしか設定できないようです。  
[Elasticドキュメント](https://www.elastic.co/guide/en/logstash/current/plugins-filters-aggregate.html)  
aggregate句はどのように記載すれば良いのでしょうか。

調べてもなかなか分からないのでご質問させてください。  
宜しくお願いします。

---

<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:** [August 6, 2019, 1:26pm UTC](https://discuss.elastic.co/t/aggregate-task-id/193923/2 "2019-08-06T13:26:13Z")

</div>

こんにちわ

idとhostでキーとしてグルーピングをしたい、ということでしたらばtask\_idをidとhostを連結した文字列としてはどうでしょうか？

> task\_id =\> "%{id}-%{host}"

idとhostを”-"をつなげて連結した文字列で一意になるという前提です。

テストデータとして、以下のようなCSVデータを用意しました。

| id | host | name |
| --- | --- | --- |
| 1 | 0.0.0.0 | hoge |
| 1 | 1.1.1.1 | fuga |
| 2 | 0.0.0.0 | piyo |
| 2 | 0.0.0.0 | piyopiyo |
| 3 | 0.0.0.0 | bar |
| 3 | 0.0.0.0 | barbar |
| 3 | 0.0.0.0 | barbarbar |

logstashのfilterは以下のようにしました。

```conf
filter {
    # import csv data
    csv {
        # set Column's names
        columns => ["id","host","name"]
        separator => ","
    }

    aggregate {
        task_id => "%{id}-%{host}"
        code => "
            map['id'] = event.get('id')
            map['host'] = event.get('host')
            map['name'] ||= []
            map['name'] << event.get('name')
            event.cancel()
        "
        push_previous_map_as_event => true
        timeout => 3
    }
}

```

結果をstdoutで確認してみますと、nameがidとhostごとに出力されています。

```auto
{
    "@timestamp" => 2019-08-06T13:19:30.249Z,
      "@version" => "1",
          "host" => "0.0.0.0",
          "name" => [
        [0] "hoge"
    ],
            "id" => "1"
}
{
    "@timestamp" => 2019-08-06T13:19:30.255Z,
      "@version" => "1",
          "host" => "1.1.1.1",
          "name" => [
        [0] "fuga"
    ],
            "id" => "1"
}
{
    "@timestamp" => 2019-08-06T13:19:30.257Z,
      "@version" => "1",
          "host" => "0.0.0.0",
          "name" => [
        [0] "piyo",
        [1] "piyopiyo"
    ],
            "id" => "2"
}
{
    "@timestamp" => 2019-08-06T13:19:38.093Z,
      "@version" => "1",
          "host" => "0.0.0.0",
          "name" => [
        [0] "bar",
        [1] "barbar",
        [2] "barbarbar"
    ],
            "id" => "3"
}

```

何か参考になれば幸いです。

---

<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:** [August 6, 2019, 11:38pm UTC](https://discuss.elastic.co/t/aggregate-task-id/193923/3 "2019-08-06T23:38:31Z")

</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:** [September 3, 2019, 11:38pm UTC](https://discuss.elastic.co/t/aggregate-task-id/193923/4 "2019-09-03T23:38:41Z")

</div>

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