在推送到elasticsearch之前,我将日志文件传递给logstash进行修改。
我有时会将其中一个字段显示为一系列数字
foobar = 42
有时它带有字母前缀
foobar = ws-42
我想确保该字段始终是整数,如果存在任何非数字,则删除它们。
这是logstash配置的一部分,它确保该字段是一个整数
filter {
mutate {
convert => [ "foobar", "integer"]
}
}
如果有字符,我如何删除字符?
更新
通过使用mutate过滤器,我可以去除非数值,或者我可以转换为整数。但是,如果我尝试同时执行这两项操作,则返回0.
实施例
input {
stdin {}
}
filter {
kv { }
mutate {
gsub => [ "foobar", "\D", "" ]
convert => [ "foobar", "integer" ]
}
}
这是输出。请注意,如果提供'42',那么foobar返回42的整数,但是如果你提供'sw-42'foobar返回0
foobar="42"
{
"message" => "foobar=\"42\"",
"@version" => "1",
"@timestamp" => "2015-03-31T22:32:11.718Z",
"host" => "swat-logstash02",
"foobar" => 42
}
foobar="sw-42"
{
"message" => "foobar=\"sw-42\"",
"@version" => "1",
"@timestamp" => "2015-03-31T22:32:23.822Z",
"host" => "swat-logstash02",
"foobar" => 0
}
答案 0 :(得分:3)
这是一个范围问题。
如果只执行gsub(没有转换),则表明正则表达式正在运行:
{
"message" => "foobar=\"sw-42\"",
"@version" => "1",
"@timestamp" => "2015-03-31T22:42:40.097Z",
"host" => "0.0.0.0",
"foobar" => "42"
}
所以你应该把它作为两个节来运行:
filter {
kv { }
mutate {
gsub => [ "foobar", "\D", "" ]
}
mutate {
convert => [ "foobar", "integer" ]
}
}