【问题标题】:Logstash output from json parser not being sent to elasticsearchjson解析器的Logstash输出未发送到elasticsearch
【发布时间】:2016-01-13 03:34:36
【问题描述】:

这是对我的另一个问题的跟进: JSON parser in logstash ignoring data? 但是这次我觉得问题比上次更清楚,可能更容易有人回答。

我正在使用这样的 JSON 解析器:

json #Parse all the JSON
{
    source => "MFD_JSON"
    target => "PARSED"
    add_field => { "%{FAMILY_ID}" => "%{[PARSED][platform][family_id][1]}_%{[PARSED][platform][family_id][0]}" }
}

logstash.stdout 中日志的输出部分如下所示:

        "FACILITY_NUM" => "1",
       "LEVEL_NUM" => "7",
         "PROGRAM" => "mfd_status",
       "TIMESTAMP" => "2016-01-12T11:00:44.570Z",
       MORE FIELDS

当我删除 JSON 代码时,有一大堆字段与上述字段类似。当我添加 JSON 过滤器时,由于某种原因,整个日志从 elasticserach/kibana 中消失。 JSON过滤器添加的位如下:

"PARSED" => {  
    "platform" => {
               "boot_mode" => [
            [0] 2,
            [1] "NAND"
        ],
                "boot_ver" => [
            [0] 6,
            [1] 1,
            [2] 32576,
            [3] 0
        ],
            WHOLE LOT OF OTHER VARIABLES

               "family_id" => [
            [0] 14,
            [1] "Hatchetfish"
        ],
            A WHOLE LOT MORE VARIABLES
    },
       "flash" => [
        [0] 131072,
        [1] 7634944
    ],
      "can_id" => 1700,
     "version" => {
          "kernel" => "3.0.35 #2 SMP PREEMPT Thu Aug 20 10:40:42 UTC 2015",
        "platform" => "17.0.32576-r1",
         "product" => "next",
             "app" => "53.1.9",
            "boot" => "2013.04 (Aug 20 2015 - 10:33:51)"
    }
},
    "%{FAMILY_ID}" => "Hatchetfish 14"

让我们假装 JSON 不起作用,我现在可以接受了,它不应该与来自 elasticsearch/kibana 的日志相关的所有其他事情搞混。此外,最后我将 FAMILY_ID 作为我使用 add_field 单独添加的字段。至少应该显示出来,对吧?

如果有人以前见过这样的东西,那将是很大的帮助。 也很抱歉两次发送几乎相同的问题。

示例日志行:

1452470936.88 1448975468.00 1 7 mfd_status 000E91DCB5A2 负载 {"up":[38,1.66,0.40,0.13],"mem":[967364,584900,3596,116772],"cpu":[1,299,812,17 3157,480,144],"cpu_dvfs":[996,1589,792,871,396,1320],"cpu_op":[996,50]}

将解析示例行(加载后的所有内容都是JSON),在stdout中我可以看到它解析成功,但我在elasticsearch中没有看到它。 这是我的输出代码:

elasticsearch 
{ 
hosts => ["localhost:9200"] 
document_id => "%{fingerprint}"
}
stdout { codec => rubydebug }

我的很多logstash过滤器都在另一个问题中,但我认为现在所有相关部分都在这个问题中。 如果你想看看这里的链接:JSON parser in logstash ignoring data?

【问题讨论】:

  • 如果您希望人们在这方面提供帮助,您需要分享您的 logstash 配置(至少是相关部分)以及您知道当前配置失败的真实示例日志行.
  • @Val 我更新了问题以获得一些日志和代码。我的很多 logstash 配置都在我之前的问题中,除了我将 grok 换成了 csv 解析器,但这不应该影响这一点,因为它之前也在做同样的事情。
  • @Val 我刚刚测试了它,删除了除 JSON 过滤器(仅使用源设置)之外的所有过滤器,并且仅使用问题中的日志示例(只是其中的 JSON 部分) .它像以前一样在 logstash.stdout 文件中解析,但没有在 kibana 中显示。所以我必须假设我的输出是错误的,或者我使用的 JSON 过滤器错误。

标签: elasticsearch logstash kibana elastic-stack


【解决方案1】:

在这里回答我自己的问题。这不是理想的答案,但如果有人和我有类似的问题,你可以试试这个。

json #Parse all the JSON
{
    source => "MFD_JSON"
    target => "PARSED"
    add_field => { "%{FAMILY_ID}" => "%{[PARSED][platform][family_id][1]}_%{[PARSED][platform][family_id][0]}" }
}

这就是我之前解析所有 JSON 的方式,我一直在反复试验,希望有一天能得到它。我正要使用 grok 过滤器来获取我想要的位,如果这对您不起作用,这是一个选项。后来我又回到了这个问题,并想“如果我之后删除所有内容会怎样”,因为我已经忘记了一些疯狂的原因。最后我做到了:

            json
        {
            source => "MFD_JSON"
            target => "PARSED_JSON"
            add_field => { "FAMILY_ID" => "%{[PARSED_JSON][platform][family_id][1]}_%{[PARSED_JSON][platform][family_id][0]}"  }
            remove_field => [ "PARSED_JSON" ]
        }

因此,提取您感兴趣的字段,然后删除解析器最后生成的字段。这对我有用。我不知道为什么,但它可能也适用于其他人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多