每个人。我是麋鹿的新手,我对原木有疑问。 我有一些服务,每个服务都有4或6个日志;这意味着一个具有弹性的文档可能有4或6个日志。 我想阅读这些日志,如果它们具有相同的ID,请将它们放在一个弹性文档中。 我必须指定所有日志都具有唯一的“ id”,并且每个请求以及引用该请求的每个日志都具有相同的ID。每个日志都有特定的类型。 我想将所有具有相同ID和类型的日志放在一起;像这样:
{
"_id":"123",
"Type1":{},
"Type2":[{},{}],
"Type3":[{},{}],
"Type4":{}
}
每个日志都具有相同的需求集: 其中一些必须在同一组中。因为它们的类型相同。看上面的例子。 Type2是Json Array,具有2个json。我想使用logstash读取每个日志并将其分类。 想象一下,我们的文档目前就像下面的JSON:
{
"_id": "123",
"Type1":{},
"Type2":[{},{}],
"Type3":{}
}
现在将出现一个新日志,标识为123,类型为Type4。该文档必须这样更新:
{
"_id": "123",
"Type1":{},
"Type2":[{},{}],
"Type3":{},
"Type4":{}
}
再次,我有一个ID为123且类型为Type3的新日志。文档更新是这样的:
{
"_id": "123",
"Type1":{},
"Type2":[{},{}],
"Type3":[{},{}],
"Type4":{}
}
我尝试使用脚本,但是没有成功。 :
{
"id": 1,
"Type2": {}
}
脚本为:
input {
stdin {
codec => json_lines
}
}
output {
elasticsearch {
hosts => ["XXX.XXX.XXX.XXX:9200"]
index => "ss"
document_id => "%{requestId}"
action => "update" # update if possible instead of overwriting
document_type => "_doc"
script_lang => "painless"
scripted_upsert => true
script_type => "inline"
script => 'if (ctx._source.Type3 == null) { ctx._source.Type3 = new ArrayList() } if(!ctx._source.Type3.contains("%{Type3}")) { ctx._source.Type3.add("%{Type3}")}'
}
}
现在我的问题是这种脚本格式只是一种类型;如果它适用于多种类型,它将是什么样? 还有一个问题。我有一些日志,他们没有ID,或者他们有ID,但没有类型。我想将这些日志保存在弹性图中,该怎么办?
答案 0 :(得分:0)
您可以查看aggregate过滤器插件以获取logstash。或者,如您提到的,如果某些日志没有ID,则可以使用fingerprint过滤器插件来创建ID,您可以使用该ID来更新Elasticsearch中的文档。 例如:
input {
stdin {
codec => json_lines
}
}
filter {
fingerprint {
source => "message"
target => "[@metadata][id]"
method => "MURMUR3"
}
}
output {
elasticsearch {
hosts => ["XXX.XXX.XXX.XXX:9200"]
index => "ss"
document_id => "%{[@metadata][id]}"
action => "update" # update if possible instead of overwriting
}
}