使用logstash
中的elasticsearch output
,如果较新,如何仅更新日志消息的@timestamp
?
我不想重新索引整个文档,也不想将同一日志消息索引两次。
此外,如果@timestamp
较旧,则不得更新/替换当前版本。
目前,我正在这样做:
filter {
if ("cloned" in [tags]) {
fingerprint {
add_tag => [ "lastlogin" ]
key => "lastlogin"
method => "SHA1"
}
}
}
output {
if ("cloned" in [tags]) {
elasticsearch {
action => "update"
doc_as_upsert => true
document_id => "%{fingerprint}"
index => "lastlogin-%{+YYYY.MM}"
sniffing => true
template_overwrite => true
}
}
}
它类似于如何在从logstash索引到elasticsearch时删除重复的文档,但我不想总是更新message
字段;只有当@timestamp
字段更新时。
你不能从 Logstash 级别决定一个文档是否需要更新或什么都不做,这需要在 Elasticsearch 级别决定。这意味着您需要使用 _update
API 进行试验和测试。
我建议看看 https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update.html#upserts。这意味着,如果文档存在,则执行脚本(如果需要,可以检查@timestamp
),否则upsert
的内容将被视为新文档。