Logstash: объединить два журнала в один выходной документ
Я установил syslog для отправки журналов в logstash со следующими фильтрами:
output {
elasticsearch
{ hosts => ["localhost:9200"]
document_id => "%{job_id}"
}
}
filter {
grok {
overwrite => ["message"]
}
json {
source => "message"
}
}
Типичное сообщение одного из моих приложений будет иметь начальное состояние и job_id:
{"job_id": "xyz782", state: "processing", job_type: "something"}
Примерно через несколько минут другой журнал будет иметь тот же log_id, другое состояние и время обработки:
{"job_id": "xyz782", state:"failed", processing_time: 12.345}
Эти поля загружаются правильно, но создаются два документа. Я хотел бы, чтобы только один документ создавался для исходного журнала, а второй журнал вместо этого обновлял бы первый, означая, что обновленный документ будет иметь следующие поля:
{"job_id": "xyz782", state: "failed", job_type: "something", processing_time: 12.345}
Как вы можете видеть в моем выводе logstash conf, я использую job_id в качестве идентификатора документа, однако второе сообщение, кажется, заменяет поля из первого сообщения, но также стирает все поля в первом сообщении, которых нет в второе, например, поле job_type, присутствующее в первом сообщении, не появляется в конечном документе. Это может быть связано с тем фактом, что json происходит от одного и того же поля «message» оба раза. Есть ли другой способ получить объединение двух сообщений журнала в один документ в logstash?