繁体   English   中英

Logstash拆分根消息

[英]Logstash split root message

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

{
    "name": "decoder.example.type-3",
    "value": 2000,
    "from": 1517847790049
    "to": 1517847840004
}

这是我的logstash配置,效果很好。 它将删除所有http标头,原始计数器名称,并将example添加为interface并将type-3transaction

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
  }
]

我可以肯定我应该使用分割过滤器,但是我不知道该如何使用它。 我曾尝试使用不同的field设置target放置json插件前后的split ,但似乎没有按预期工作。

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

在我的配置中,我首先使用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字段是否包含您发布的对象。 因为如果是这样,您的骗子将无法在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}"
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM