Синтаксис формата sprintf, который вы используете (%{[@metadata][kafka][topic]}
) для получения значения этого поля, является правильным.
Предположительно, в вашем документе нет такого поля @metadata.kafka.topic
. Поэтому sprintf не может получить значение поля, и в результате вновь созданное поле содержит вызов sprintf в виде строки.
Однако, поскольку вы установили decorate_events => true
, поля метаданных должны быть доступны, как указано в документации (https://www.elastic.co/guide/en/logstash/current/plugins-inputs-kafka.html):
Только метаданные добавляется к событию, если для опции decorate_events установлено значение true (по умолчанию - false).
Я могу себе представить, что действие add_field
, установленное во входном плагине , вызывает вопрос. Поскольку опция decorate_events
сначала позволяет добавлять поля метаданных, действие add_field
должно занимать второе место после плагина ввода.
Ваша конфигурация будет выглядеть следующим образом:
input {
kafka {
bootstrap_servers => "******"
topics_pattern => [".*"]
decorate_events => true
}
}
filter {
mutate{
add_field => { "[topic_name]" => "%{[@metadata][kafka][topic]}"}
}
date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "logstash"
document_type => "logs"
}
}