harue
(harue)
August 6, 2019, 5:27am
1
お世話になっております。
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ドキュメント
aggregate句はどのように記載すれば良いのでしょうか。
調べてもなかなか分からないのでご質問させてください。
宜しくお願いします。
tsgkdt
(tsgkdt)
August 6, 2019, 1:26pm
2
こんにちわ
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は以下のようにしました。
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ごとに出力されています。
{
"@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"
}
何か参考になれば幸いです。
system
(system)
Closed
September 3, 2019, 11:38pm
4
This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.