elasticsearch 日志存储分割根消息,elasticsearch,logstash,elasticsearch,Logstash" /> elasticsearch 日志存储分割根消息,elasticsearch,logstash,elasticsearch,Logstash" />

elasticsearch 日志存储分割根消息

elasticsearch 日志存储分割根消息,elasticsearch,logstash,elasticsearch,Logstash,我正在收集有关我的应用程序的一些指标,并定期通过REST逐个导出它们。输出json如下所示: { "name": "decoder.example.type-3", "value": 2000, "from": 1517847790049 "to": 1517847840004 } 这是我的logstash配置,运行良好。它将删除所有http头、原始计数器名称,并将示例添加为接口和类型3添加为事务 input { http { port =>

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

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

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}"
  }
}
我现在要做的是将我的所有指标一次作为json数组发送,并拆分所有这些消息,然后逐个应用应用于它们的相同逻辑。输入消息的示例如下所示:

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


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

在我的配置中,我首先使用了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}"
  }
}
但这假定您总是有一个消息字段作为数组。

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

这是我最后的配置。也许可以用更少的步骤来完成,但效果很好。我必须移动一些字段来保持相同的结构,所以它比我最初一个接一个工作的字段大一点

基本思想是将解析后的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}"
  }
}

这帮了大忙。。。我会在最后公布我所做的,这有点复杂,但这帮助我朝着正确的方向前进。谢谢