I've got a JSON of the format:
{
"SOURCE":"Source A",
"Model":"ModelABC",
"Qty":"3"
}
我正在尝试使用logstash解析这个JSON。基本上,我希望logstash的输出是一个键值对列表,以便我可以使用kibana进行分析。我认为这可以直接完成。通过大量阅读,我了解到必须使用grok插件(我仍然不确定json插件是用来做什么的)。但是我无法获取包含所有字段的事件。我会得到多个事件(每个JSON属性一个事件)。就像这样:
{
"message" => " \"SOURCE\": \"Source A\",",
"@version" => "1",
"@timestamp" => "2014-08-31T01:26:23.432Z",
"type" => "my-json",
"tags" => [
[0] "tag-json"
],
"host" => "myserver.example.com",
"path" => "/opt/mount/ELK/json/mytestjson.json"
}
{
"message" => " \"Model\": \"ModelABC\",",
"@version" => "1",
"@timestamp" => "2014-08-31T01:26:23.438Z",
"type" => "my-json",
"tags" => [
[0] "tag-json"
],
"host" => "myserver.example.com",
"path" => "/opt/mount/ELK/json/mytestjson.json"
}
{
"message" => " \"Qty\": \"3\",",
"@version" => "1",
"@timestamp" => "2014-08-31T01:26:23.438Z",
"type" => "my-json",
"tags" => [
[0] "tag-json"
],
"host" => "myserver.example.com",
"path" => "/opt/mount/ELK/json/mytestjson.json"
}
我应该使用multi-line编解码器还是json_lines编解码器?如果需要,我应该如何操作?我需要自己编写grok模式吗?还是有通用的JSON解析方法可以为我提供具有键值对的一个事件,就像上面的一个事件?我找不到任何能够解决我的问题的文档。非常感谢你的帮助。下面是我的配置文件:
input
{
file
{
type => "my-json"
path => ["/opt/mount/ELK/json/mytestjson.json"]
codec => json
tags => "tag-json"
}
}
filter
{
if [type] == "my-json"
{
date { locale => "en" match => [ "RECEIVE-TIMESTAMP", "yyyy-mm-dd HH:mm:ss" ] }
}
}
output
{
elasticsearch
{
host => localhost
}
stdout { codec => rubydebug }
}
start_position => beginning
以确保它从记录的开头开始... 还有你的文件中是否还有其他内容?(您可以删除过滤器,只需添加output { stdout {} }
来查看它正在收集什么以传递给 json 过滤器) - Alcanzarjson
处理之前,您需要“修复”消息。例如,您可以使用mutate
过滤器和gsub => [ 'message','\"','']
。如果您需要更复杂的内容,则可以使用ruby
代码过滤器。 - Alcanzarif [message] =~ /^{.*}$/ {json { source => message } }
。如何将我的多行JSON缩减为一行?我不是Ruby专家,所以我无法做到这一点。有什么建议吗?奇怪的是我找不到其他需要解析多行JSON的人。 - Joseph