如何在logstash中使用mutate和gsub替换值的一部分

时间:2018-02-21 14:20:50

标签: regex logstash

我的日志文件中有这样的内容:

DATATYPE::SERVICEPERFDATA       TIMET::1519222690       HOSTNAME::localhost     SERVICEDESC::Total Processes    SERVICEPERFDATA::procs=59;250;400;0;    SERVICECHECKCOMMAND::check_local_procs!250!400!RSZDT  HOSTSTATE::UP    HOSTSTATETYPE::HARD     SERVICESTATE::OK        SERVICESTATETYPE::HARD

我想将消息中的SERVICEPERFDATA::procs=59;250;400;0;替换为此类键值对。

SERVICEPERFDATA::59

所以我可以使用kv过滤器将数据拆分为键和值。

我尝试过使用Logstash mutate和gsub,但找不到合适的正则表达式来实现我的目标。

谢谢, 查兰

2 个答案:

答案 0 :(得分:3)

您可以使用捕获组来获取正则表达式的一部分,并在mutate / gsub配置的替换部分中使用它。

mutate {
  gsub => ["message","(?<=SERVICEPERFDATA::)procs=(\d+);\S+", "\1"]
}

(?<=SERVICEPERFDATA::)使正则表达式仅适用于SERVICEPERFDATA::procs=(\d+);\S+正则表达式会将procs=和下一个;之间的所有数字放在一个组中,然后将其用于配置的替换部分("\1")。 / p>

查看regex explanation

过滤器的结果:SERVICEPERFDATA::59

另一种选择是使用两个mutate / gsub过滤器,每个过滤器都有一个更简单的配置。

答案 1 :(得分:2)

正则表达式procs=([^;]+)\S+(?<=SERVICEPERFDATA::)procs=([^;]+)\S+ Substutution \1

详细说明:

  • ()捕获小组
  • [^]匹配列表中不存在的单个字符
  • +匹配一次且无限次
  • \S匹配任何非空格字符(等于[^\r\n\t\f\v ]
  • \1第1组。

代码:

mutate {
    gsub => [
      "fieldname", "procs=([^;]+)\S+", "\1",
    ]
}