2015-01-14 3 views
0

Использование Logstash 1.4.2 с ElasticSearch 1.3 (я знаю, что это не последняя версия ES) на Ubuntu 14.04 LTS.Logstash удаляет поле после JSON-разбора

У нас есть поток событий, который содержит JSON внутри одного из полей с именем «message».

Мы хотели бы заменить поля события JSON этого поля, если оно найдено.

Мы также хотели бы удалить ОРИГИНАЛЬНОЕ поле «сообщение» (тот, который содержит строку JSON), если он найден и проанализирован.

Проблема заключается в том, что объект JSON внутри текста поля может определять новое поле «сообщение», которое мы должны сохранить.

Следующая удаляет поле «сообщение» всегда после разбора его:

json { 
    source => "message" 
    remove_field => [ "message" ] 
} 

Что это неправильно, мы хотим, чтобы держать его в случае, если было поле «сообщение» в значении оригинала «сообщение "поле.

Я пытался сделать следующий трюк, но, кажется, до сих пор удалить поле «сообщение» от результата:

mutate { 
    rename => [ "message", "___temp_logstash_filter_message___" ] 
} 
json { 
    source => "___temp_logstash_filter_message___" 
} 
mutate { 
    remove_field => [ "___temp_logstash_filter_message___" ] 
} 

т.е. я пытаюсь переименовать исходное поле «сообщение» для произвольного внутреннего имени который я не ожидаю появляться во входном значении, проанализируйте строку JSON с использованием этого временного имени в качестве источника, а затем удалите переименованное исходное поле.

Таким образом, я надеялся различать «исходное» поле сообщения и любое поле «сообщение», которое может содержаться внутри его значения JSON. Но это, похоже, не имеет значения - поле «сообщение» по-прежнему отсутствует в результате.

Есть ли способ достичь того, что мне нужно?

Спасибо.

+0

Попробуйте поместить оригинальный мутировать {} в отдельный фильтр {} блока. Я обнаружил, что это иногда помогает в области поля. –

+0

Кроме того, поместите remove_field внутри блока json {}, поэтому поле temp будет удалено только в том случае, если оно будет выполнено успешно. –

+0

Спасибо за советы. Перенос первого мутанта {} может быть проблемой, потому что все это делается внутри блока условий. О втором мутате {} - я выразился в отдельной строфе, чтобы сделать логику более удобочитаемой, но я попробую то, что вы тоже скажете. BTW - поле ___temp_logstash_fileter_message___ НЕ появлялось на выходе, поэтому я считаю, что эта часть не является проблемой. –

ответ

0

Вместо того чтобы переименовывать поле, скопируйте первое поле в новое.

Это может быть сделано с:

filter { 
    ... 
    ruby { 
     code => "event['new_field'] = event['old_field']" 
    } 
    ... 
} 
+0

Спасибо. Мне все еще нужно выяснить после разбора JSON, следует ли удалять поле сообщения. Возможно, переименовав его с помощью Ruby или сравнив предварительный анализ с версией после анализа, я смогу добиться этого? –

Смежные вопросы