使用Logstash,如果没有为该文档的时间戳创建索引,我的目标是为该文档建立索引;否则,如果该文档确实存在且该时间戳不在数组中,则追加时间戳数组。我的问题是将数组追加到数组。
即我的输入日志行始终与要附加到Elastic中同一文档的时间戳相同。
这是我的输入数据。
“哈希”字段将成为文档ID(仅用于示例)
{"timestamp":"1534023333", "hash":"1"}
{"timestamp":"1534022222", "hash":"1"}
{"timestamp":"1534011111", "hash":"1"}
这是我的Logstash配置:
params.event.get是因为它会阻止动态脚本编译
input {
file {
path => "timestamp.json"
start_position => "beginning"
codec => "json"
}
}
filter {
mutate {
split => { "timestamp" => "," }
}
}
output {
elasticsearch {
hosts => ["http://127.0.0.1:9200"]
index => "test1"
document_id => "%{[hash]}"
doc_as_upsert => true
script => 'if(ctx._source.timestamp.contains(params.event.get("timestamp"))) return true; else (ctx._source.timestamp.add(params.event.get("timestamp")))'
action => "update"
retry_on_conflict=>3
}
#stdout { codec => rubydebug }
}
这是输出。
请注意,时间戳是一个数组。但是每个值都与 数组作为数组。
"timestamp": [
"1534011111",
[
"1534022222"
],
[
"1534023333"
]
],
我想要的输出是:
"timestamp": [
"1534011111",
"1534022222"
"1534023333"
],
如何获得所需的输出?我正在运行Elasticsearch 6.4.2和Logstash 6.4.2。
答案 0 :(得分:1)
问题在于split => { "timestamp" => "," }
将timestamp
字段转换为数组,而add
方法接受一个对象,并将其追加到原始数组(它不连接两个数组)。
不费吹灰之力地尝试访问timestamp
数组的第一个元素,如下所示:
if(ctx._source.timestamp.contains(params.event.get("timestamp")[0])) return true; else (ctx._source.timestamp.add(params.event.get("timestamp")[0]))