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

logstash - remove all non digit characters from field

我有一些日志文件要传递到 logstash,以便在推送到 elasticsearch 之前进行修改。

我的其中一个字段有时会显示为一系列数字

foobar = 42

有时以字母为前缀

foobar = ws-42

我想确保该字段始终为整数,并且如果存在任何非数字,则将其删除。

这是 logstash 配置的一部分,它确保该字段是一个整数

filter {
  mutate {
    convert => [ "foobar", "integer"]
  }
}

如果存在字符,我如何去掉这些字符?

更新

通过使用 mutate 过滤器,我可以去除非数值,也可以转换为整数。但是,如果我尝试两者都做,它 returns 0.

例子

input {
  stdin {}
}

filter {
  kv { }
  mutate {
    gsub => [ "foobar", "\D", "" ]
    convert => [ "foobar", "integer" ]
  }
}

这是输出。请注意,如果提供“42”,则 foobar returns 为 42 的整数,但是如果您提供 'sw-42' foobar returns 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
}

这是一个范围界定问题。

如果您只执行 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" ]
  }
}