Logstash拆分根消息

时间:2018-02-05 17:13:41

标签: elasticsearch logstash

我正在收集有关我的应用程序的一些指标,并定期通过REST逐个导出它们。输出json看起来像:

:hi def link PreviousSearch MoreMsg " Define some different highlight group based on some existing one.
:execute 'match PreviousSearch /' . @/ . '/'

这是我的{ "name": "decoder.example.type-3", "value": 2000, "from": 1517847790049 "to": 1517847840004 } 配置运行良好。它将删除所有http标头,原始计数器名称,并将logstash添加为example,将interface添加为type-3

transaction

我现在要做的是立即将所有指标作为json数组发送并拆分所有这些消息并应用逐个应用的相同逻辑。输入消息的示例如下所示:

input {
  http {
    port => 31311
  }
}

filter {
  json {
    source => "message"
  }

  grok {
    match => [ "name", "decoder.%{WORD:interface}.%{NOTSPACE:transaction}" ]
  }

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

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

我很确定我应该使用split过滤器,但我无法弄清楚如何使用它。我尝试在[ { "name": "decoder.example.type-3", "value": 2000, "from": 1517847790049, "to": 1517847840004 }, { "name": "decoder.another.type-0", "value": 3500, "from": 1517847790049, "to": 1517847840004 } ] 插件前后放置split,使用不同的json设置,field,但似乎没有任何效果符合预期。

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:1)

在我的配置中,我首先使用split,然后我做了逻辑。你应该看看基于这样的东西:

input {
  http {
    port => 31311
  }
}

filter {
  json {
    source => "message"
  }

  split{
    field => "message"
  }

  grok {
    match => [ "name", "decoder.%{WORD:interface}.%{NOTSPACE:transaction}" ]
  }

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

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

但是这假设你总是有一个数组的消息字段 哦是的,我认为您应该检查是否有新的message字段包含您发布的对象。因为如果是这样,你的grok在name下找不到任何内容,你需要匹配message.name。 (我通常会从temp创建一个[message][name]字段并稍后删除temp,因为我不想查找如何调用嵌套字段。必须有一个更聪明的方法。)

答案 1 :(得分:1)

这是我最终的配置。也许它可以用更少的步骤完成,但这很有效。我不得不移动一些字段以保持相同的结构,因此它比我最初的一个一个一个地工作。

基本思想是将解析后的json放入特定字段,而不是根目录,然后拆分该新字段。

input {
  http {
    port => 31311
  }
}

filter {
  json {
    source => "message"
    target => "stats"
  }

  split {
    field => "stats"
  }

  grok {
    match => [ "[stats][name]", "decoder.%{WORD:interface}.%{NOTSPACE:transaction}" ]
  }

  mutate {
    add_field => {
      "value" => "%{[stats][value]}"
      "from" => "%{[stats][from]}"
      "to" => "%{[stats][to]}"
    }

    remove_field => [ "headers", "message", "stats" ]
  }

  mutate {
    convert => {
      "value" => "integer"
      "from" => "integer"
      "to" => "integer"
    }
  }
}

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