logstash - 从字段中删除所有非数字字符

时间:2015-03-31 20:36:38

标签: logstash logstash-grok

在推送到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
}

1 个答案:

答案 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" ]
  }
}