logstash kv 过滤器,使用动态映射将字符串转换为整数
logstash kv filter, converting strings to integers using dynamic mapping
我的日志格式类似于:
name=johnny amount=30 uuid=2039248934
问题是我在多个日志文件上使用这个解析器,每个日志文件基本上都包含许多 kv 对。
有没有一种方法可以识别值何时为整数并将其转换为整数,而不必对每个键值对使用 mutate?(而不是字符串)
我找到了这个 link,但它在模板 json 文件应该放在哪里以及我将如何使用它方面非常模糊。
可以告诉 kv 自动检测数值并将它们作为数字 JSON 值发出吗?
您可以使用 ruby 插件。
input {
stdin {}
}
filter {
ruby {
code => "
fieldArray = event['message'].split(' ');
for field in fieldArray
name = field.split('=')[0];
value = field.split('=')[1];
if value =~ /\A\d+\Z/
event[name] = value.to_i
else
event[name] = value
end
end
"
}
}
output {
stdout { codec => rubydebug }
}
首先,通过SPACE将消息拆分为一个数组。
然后,对于每个 k,v 映射,检查值是否为数字,如果是,则将其转换为整数。
这是您输入的示例输出:
{
"message" => "name=johnny amount=30 uuid=2039248934",
"@version" => "1",
"@timestamp" => "2015-06-25T08:24:39.755Z",
"host" => "BEN_LIM",
"name" => "johnny",
"amount" => 30,
"uuid" => 2039248934
}
Logstash 5 的更新解决方案:
input {
stdin {}
}
filter {
ruby {
code => "
fieldArray = event['message'].split(' ');
for field in fieldArray
name = field.split('=')[0];
value = field.split('=')[1];
if value =~ /\A\d+\Z/
event.set(name, value.to_i)
else
event.set(name, value)
end
end
"
}
}
output {
stdout { codec => rubydebug }
}
请注意,如果您决定升级到 Logstash 5,则有一些重大更改:
https://www.elastic.co/guide/en/logstash/5.0/breaking-changes.html
特别是事件需要修改为使用event.get或event.set。这是我用来让它工作的方法(基于 Ben Lim 的示例):
input {
stdin {}
}
filter {
ruby {
code => "
fieldArray = event.get('message').split(' ');
for field in fieldArray
name = field.split('=')[0];
value = field.split('=')[1];
if value =~ /\A\d+\Z/
event.set(name, value.to_i)
else
event.set(name, value)
end
end
"
}
}
output {
stdout { codec => rubydebug }
}
我的日志格式类似于:
name=johnny amount=30 uuid=2039248934
问题是我在多个日志文件上使用这个解析器,每个日志文件基本上都包含许多 kv 对。
有没有一种方法可以识别值何时为整数并将其转换为整数,而不必对每个键值对使用 mutate?(而不是字符串)
我找到了这个 link,但它在模板 json 文件应该放在哪里以及我将如何使用它方面非常模糊。 可以告诉 kv 自动检测数值并将它们作为数字 JSON 值发出吗?
您可以使用 ruby 插件。
input {
stdin {}
}
filter {
ruby {
code => "
fieldArray = event['message'].split(' ');
for field in fieldArray
name = field.split('=')[0];
value = field.split('=')[1];
if value =~ /\A\d+\Z/
event[name] = value.to_i
else
event[name] = value
end
end
"
}
}
output {
stdout { codec => rubydebug }
}
首先,通过SPACE将消息拆分为一个数组。 然后,对于每个 k,v 映射,检查值是否为数字,如果是,则将其转换为整数。
这是您输入的示例输出:
{
"message" => "name=johnny amount=30 uuid=2039248934",
"@version" => "1",
"@timestamp" => "2015-06-25T08:24:39.755Z",
"host" => "BEN_LIM",
"name" => "johnny",
"amount" => 30,
"uuid" => 2039248934
}
Logstash 5 的更新解决方案:
input {
stdin {}
}
filter {
ruby {
code => "
fieldArray = event['message'].split(' ');
for field in fieldArray
name = field.split('=')[0];
value = field.split('=')[1];
if value =~ /\A\d+\Z/
event.set(name, value.to_i)
else
event.set(name, value)
end
end
"
}
}
output {
stdout { codec => rubydebug }
}
请注意,如果您决定升级到 Logstash 5,则有一些重大更改:
https://www.elastic.co/guide/en/logstash/5.0/breaking-changes.html
特别是事件需要修改为使用event.get或event.set。这是我用来让它工作的方法(基于 Ben Lim 的示例):
input {
stdin {}
}
filter {
ruby {
code => "
fieldArray = event.get('message').split(' ');
for field in fieldArray
name = field.split('=')[0];
value = field.split('=')[1];
if value =~ /\A\d+\Z/
event.set(name, value.to_i)
else
event.set(name, value)
end
end
"
}
}
output {
stdout { codec => rubydebug }
}