如何使用字段来确定Logstash中的索引而不保存它?

时间:2017-11-30 11:13:58

标签: elasticsearch logstash logstash-grok

我第一次使用logstash,并且无法确定如何在解析字段上确定索引而不保留它。

这是我的配置文件:

input {
  http {
    port => 31311
  }
}

filter {
  json {
    source => "message"
  }

  mutate {
    remove_field => [ "headers", "message" ]
  }

  grok {
    match => [ "name", "^(?<metric-type>\w+)\..*" ]
  }
}

output {
  elasticsearch {
    hosts => [ "localhost:9200" ]
    index => "%{metric-type}-%{+YYYY.MM.dd}"
  }
}

Json示例发送到http插件:

{
  "name": "counter.custom",
  "value": 321,
  "from": "2017-11-30T10:43:17.213Z",
  "to": "2017-11-30T10:44:00.001Z"
}

此记录按预期保存在counter-2017.11.30索引中。但是,我不希望保存字段metric-type,我只需要它来确定索引。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

由于grok模式不支持grok语法,因此我使用metric-type[@metadata][metric-type]放入字段中。我使用mutate过滤器将该字段复制到@metadata,然后删除了临时字段。

input {
  http {
    port => 31311
  }
}

filter {
  json {
    source => "message"
  }

  mutate {
    remove_field => [ "headers", "message" ]
  }

  grok {
    match => [ "name", "^(?<metric-type>\w+)\..*" ]
  }

  mutate {
    add_field => { "[@metadata][metric-type]" => "%{metric-type}" }
    remove_field => [ "metric-type" ]
  }
}

output {
  elasticsearch {
    hosts => [ "http://localhost:9200" ]
    index => "%{[@metadata][metric-type]}-%{+YYYY.MM.dd}"
  }
}

- 编辑 -

正如@Phonolog在讨论中所建议的那样,有一个更简单,更好的解决方案。通过使用grok关键字匹配而不是正则表达式,我能够将捕获的组直接保存到@metadata

input {
  http {
    port => 31311
  }
}

filter {
  json {
    source => "message"
  }

  mutate {
    remove_field => [ "headers", "message" ]
  }

  grok {
    match => [ "name", "%{WORD:[@metadata][metric-type]}." ]
  }
}

output {
  elasticsearch {
    hosts => [ "http://localhost:9200" ]
    index => "%{[@metadata][metric-type]}-%{+YYYY.MM.dd}"
  }
}