我正在尝试使用文件输入,json过滤器和elasticsearch输出使用Logstash解析大型消息。 99%的时间这个工作正常,但是当我的一条日志消息太大时,我得到JSON解析错误,因为初始消息被分解为两个部分无效的JSON流。此类消息的大小约为40,000+个字符。我看看是否有关于缓冲区大小的信息,或者我应该尝试留下的一些最大长度,但没有任何运气。我发现的唯一答案与udp输入有关,并且能够更改缓冲区大小。
Does Logstash has a limit size for each event-message? https://github.com/elastic/logstash/issues/1505
这也可能与此问题类似,但从来没有任何回复或建议:Logstash Json filter behaving unexpectedly for large nested JSONs
作为一种解决方法,我想将我的消息拆分成多条消息,但我无法做到这一点,因为我需要所有信息都在Elasticsearch的同一条记录中。我不相信有办法从logstash调用Update API。此外,大多数数据都在一个数组中,所以虽然我可以使用脚本(Elasticsearch upserting and appending to array)更新Elasticsearch记录的数组,但我无法从Logstash中做到这一点。
数据记录如下所示:
{ "variable1":"value1",
......,
"variable30": "value30",
"attachements": [ {5500 charcters of JSON},
{5500 charcters of JSON},
{5500 charcters of JSON}..
...
{8th dictionary of JSON}]
}
有没有人知道让Logstash处理这些大型JSON消息的方法,或者我可以将它们拆分并让它们最终放在同一个Elasticsearch记录中的方式(使用Logstash)?
感谢任何帮助,我很乐意添加所需的任何信息!
答案 0 :(得分:2)
如果您的elasticsearch
输出设置了document_id
,它将更新文档(logstash中的默认操作是index
数据 - 如果文件已经更新,则会更新文档存在)
在您的情况下,您需要在json消息中包含一些唯一字段,然后依靠它来在elasticsearch中进行合并。例如:
{"key":"123455","attachment1":"something big"}
{"key":"123455","attachment2":"something big"}
{"key":"123455","attachment3":"something big"}
然后输出elasticsearch
,如:
elasticsearch {
host => localhost
document_id => "%{key}"
}