这是我另一个问题的跟进: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过滤器都在另一个问题中,但是我想现在所有相关部分都在这个问题中。
在这里回答我自己的问题。这不是理想的答案,但是如果有人遇到与我类似的问题,可以尝试一下。
这就是我之前解析所有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" ] }
因此,提取您感兴趣的一个或多个字段,然后最后删除解析器创建的字段。那对我有用。我不知道为什么,但是它也可能对其他人有用。