2015-05-13 1 views
5

У меня есть вход logstash, где я использую document_id для удаления дубликатов. Однако в большинстве входных данных нет document_id. Следующее отбрасывает фактическое document_id, но если оно не существует, оно принимается как буквально %{document_id}, что означает, что большинство документов рассматриваются как дубликаты друг друга. Вот как выглядит мой выходной блок:logstash output to elasticsearch with document_id; что делать, если у меня нет документа_ид?

Я думал, что смогу использовать условное выражение на выходе. Он не работает, и ошибка указана ниже кода.

output { 
     elasticsearch_http { 
      host => "127.0.0.1" 
      if document_id { 
       document_id => "%{document_id}" 
      } 
     } 
} 

Error: Expected one of #, => at line 101, column 8 (byte 3103) after output { 
     elasticsearch_http { 
    host => "127.0.0.1" 
    if 

Я попробовал несколько «если» заявления и все они терпят неудачу, поэтому я предполагаю, что проблема оказывает условную любого рода в этом блоке. Вот варианты я пытался:

if document_id <> "" { 
if [document_id] <> "" { 
if [document_id] { 
if "hello" <> "" { 

ответ

9

Вы близко к условной идее, но вы не можете разместить ее внутри блока плагинов. Сделайте это вместо того, чтобы:

output { 
    if [document_id] { 
    elasticsearch_http { 
     host => "127.0.0.1" 
     document_id => "%{document_id}" 
    } 
    } else { 
    elasticsearch_http { 
     host => "127.0.0.1" 
    } 
    } 
} 

(. Но предложение в одном из других ответов использовать UUID фильтр тоже хорошо)

+0

совершенным. Как я сказал Валу, я предпочитаю это, если uuid случайно опустится. – tedder42

5

Одним из способов решения этой проблемы является, чтобы убедиться, document_id всегда доступен. Вы можете достичь этого, добавив UUID filter в раздел фильтра, который создал бы поле document_id, если его нет.

filter { 
    if "" in [document_id] { 
     uuid { 
      target => "document_id" 
     } 
    } 
} 

Отредактированный за предложение Magnus Вернуться в. Благодаря!

+0

Типичный способ проверить на существование поля будет ', если [ document_id] {...} '. –

+0

Val, это отличный ответ и, вероятно, самый «правильный» способ сделать это. Я пойду с решением Магнуса, потому что безопаснее, если я пропущу uuid на отфильтрованном входе. Хотел бы я согласиться с обоими, так как они оба отличные ответы. – tedder42

+0

Несомненно! Лучше всего попробовать оба подхода и убедиться в этом сами;) – Val

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