一尘不染

JSON解析器的Logstash输出未发送到elasticsearch

elasticsearch

这是我另一个问题的跟进:Logstash中的JSON解析器忽略数据了吗?
但是这次我觉得问题比上次更清楚了,可能更容易回答。

我正在使用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 load {“
up”:[38,1.66,0.40,0.13],“ mem”:[967364,584900,3596,116772],“
cpu”:[1299,812,1791,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过滤器都在另一个问题中,但是我想现在所有相关部分都在这个问题中。


阅读 257

收藏
2020-06-22

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

因此,提取您感兴趣的一个或多个字段,然后最后删除解析器创建的字段。那对我有用。我不知道为什么,但是它也可能对其他人有用。

2020-06-22