Привет. Возникла вопрос по работе logstash.
Хочу сохранить в ES ответ nginx. Ответ представляет из себя json.
Натравливаю на него json плагин и получаю структуру полей в ES.
json {
source => "response_body"
target => "response_fields"
remove_field => [ "response_body" ]
}
Из этой структуры хочется удалить некоторые ненужные вложенные поля, и тут возникает проблема. Они не хотят удаляться, ни через плагин json, ни через mutate.
json {
source => "response_body"
target => "response_fields"
remove_field => [ "response_body","[response_fields][contents][agg_content_gid]" ]
}
Что может быть не так?
А у вас этот объект json в каком поле находиться? Он не в message
? Пытался воспроизвести вашу ситуацию. Не получается - у меня все работает, как ожидается
test.txt:
{"foo":"bar", "contents": {"agg_content_gid": "killme", "agg": "keep_me"}}
config/test.conf:
input {
stdin {
id => "my_plugin_id"
}
}
filter {
json {
source => "message"
target => "response_fields"
remove_field => [ "message","[response_fields][contents][agg_content_gid]" ]
}
}
output {
stdout {
codec => json
}
}
Запускаю:
bin/logstash -f config/test.conf < test.txt
Результат:
{"response_fields":{"contents":{"agg":"keep_me"},"foo":"bar"},"@version":"1","host":"bee","@timestamp":"2021-06-07T18:18:32.646Z"}
response_body появляется в результате парсинга гроком. И существует как отдельное поле.
Все работает. Попробуйте сами
test.txt:
here:{"foo":"bar", "contents": {"agg_content_gid": "killme", "agg": "keep_me"}}
config:
input {
stdin {
id => "my_plugin_id"
}
}
filter {
grok {
match => { "message" => "here:(?<response_body>.*)"}
remove_field => "message"
}
json {
source => "response_body"
target => "response_fields"
remove_field => [ "response_body","[response_fields][contents][agg_content_gid]" ]
}
}
output {
stdout {
codec => json
}
}
результат:
{"response_fields":{"contents":{"agg":"keep_me"},"foo":"bar"},"host":"bee","@timestamp":"2021-06-07T18:45:21.642Z","@version":"1"}
Увы, но нет. response_fields пишется в неизменном виде.
Не может же быть проблемы в том, что это поле многократно повторяется в структуре json-а?
test.txt:
here:{"foo":"bar", "contents": [{"agg_content_gid": "killme", "agg": "keep_me"}, {"agg_content_gid": "killmesoftly", "agg": "keep_me_please"}]}
test.conf:
input {
stdin {
id => "my_plugin_id"
}
}
filter {
grok {
match => { "message" => "here:(?<response_body>.*)"}
remove_field => "message"
}
json {
source => "response_body"
target => "response_fields"
remove_field => [ "response_body" ]
}
ruby {
code => '
fields = event.get("response_fields")
contents = fields["contents"]
if contents
newContents = []
contents.each { |c|
c.delete("agg_content_gid")
newContents << c
}
fields["contents"] = newContents
event.set("response_fields", fields)
end
'
}
}
output {
stdout {
codec => json
}
}
Спасибо, проверю. А все-таки почему json не отрабатывает?
Потому что путь задан не правильно. Правильный путь был бы
[ "response_body", "[response_fields][contents][0][agg_content_gid]" , "[response_fields][contents][1][agg_content_gid]", .... и т.д. ]
Ругается на "no implicit conversion of string to integer" но направление я понял. Спасибо.
system
(system)
Closed
July 6, 2021, 6:41pm
11
This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.