2017-02-06 2 views
2

Пытается обновить определенное поле в elasticsearch через logstash. Возможно ли обновить только набор полей через logstash?Logstash Обновление документа в elasticsearch

Пожалуйста, найдите код, приведенную ниже,

input { 
    file { 
     path => "/**/**/logstash/bin/*.log" 
     start_position => "beginning" 
     sincedb_path => "/dev/null" 
     type => "multi" 
    } 
} 

filter { 
     csv { 
       separator => "|" 
       columns => ["GEOREFID","COUNTRYNAME", "G_COUNTRY", "G_UPDATE", "G_DELETE", "D_COUNTRY", "D_UPDATE", "D_DELETE"] 

} 
elasticsearch { 
     hosts => ["localhost:9200"] 
     index => "logstash-data-monitor" 
     query => "GEOREFID:%{GEOREFID}" 
     fields => [["JSON_COUNTRY","G_COUNTRY"], 
        ["XML_COUNTRY","D_COUNTRY"]] 
      } 

if [G_COUNTRY] { 
mutate { 
    update => { "D_COUNTRY" => "%{D_COUNTRY}" 
} 
    } 
} 
} 
output { 
elasticsearch { 
     hosts => ["localhost:9200"] 
     index => "logstash-data-monitor" 
     document_id => "%{GEOREFID}" 
    } 
} 

Мы используем вышеописанную конфигурацию, когда мы используем это поле пустого значения становится удалено вместо пропуска обновления нулевого значения.

Данные взяты из двух разных источников. Один из файлов XML, а другой - из файла JSON.

Формат журнала XML: GEO-1 | CD | 23 | John | 892 | Канада | 31-01-2017 | QC | - | - | - | - | - Формат журнала JSON: GEO-1 | AS | 33 | - | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 0 | При чтении второго файла журнала необходимо обновить существующий документ. Обновление должно происходить только в первых 5 полях, если файл журнала - это XML и последние 5 полей, если файл журнала - JSON. Пожалуйста, предложите нам, как это сделать в logstash.

Пробовал с вышеуказанным кодом. Пожалуйста, проверьте, и может ли кто-нибудь помочь в том, как это исправить?

+0

Может ли кто-нибудь помочь в этом? – banu

+0

Вы предоставляете только определение фильтра, операция update/insert/upsert выполняется через выход для поиска elastics. Вы можете прочитать об этом здесь: https://www.elastic.co/guide/en/logstash/2.4/plugins-outputs-elasticsearch.html – pandaadb

+0

@pandaadb отредактировал вопрос. Можете ли вы посмотреть на вопрос и помочь в этом? – banu

ответ

2

Для выхода Elasticsearch для любых действий, кроме indexyou need to tell it to do something else.

elasticsearch { 
     hosts => ["localhost:9200"] 
     index => "logstash-data-monitor" 
     action => "update" 
     document_id => "%{GEOREFID}" 
} 

Это, вероятно, должно быть завернуто в условное состояние, чтобы гарантировать, что вы только обновляете записи, требующие обновления. Существует еще один вариант, хотя, doc_as_upsert

elasticsearch { 
     hosts => ["localhost:9200"] 
     index => "logstash-data-monitor" 
     action => "update" 
     doc_as_upsert => true 
     document_id => "%{GEOREFID}" 
} 

Это говорит плагин для вставки, если оно является новым, и обновление, если это не так.


Однако вы пытаетесь использовать два входа для определения документа. Это усложняет ситуацию. Кроме того, вы не предоставляете оба входа, поэтому я импровизирую. Чтобы обеспечить различное поведение вывода, вам необходимо определить два выхода.

input { 
    file { 
    path => "/var/log/xmlhome.log" 
    [other details] 
    } 

    file { 
    path => "/var/log/jsonhome.log" 
    [other details] 
    } 
} 

filter { [some stuff ] } 

output { 
    if [path] == '/var/log/xmlhome.log' { 
    elasticsearch { 
     [XML file case] 
    } 
    } else if [path] == '/var/log/jsonhome.log' { 
    elasticsearch { 
     [JSON file case] 
     action => "update" 
    } 
    } 
} 

Настройка его как это позволит вам изменить поведение ElasticSearch основываясь на том, где возникло событие.

+0

Я устал, что вышеописанный вариант документа не обновляется, а поле нулевого значения удаляется, а не пропускает обновление нулевого значения. elasticsearch { хостов => [ "локальный: 9200"] индекс => "logstash-данных монитор" действие => "Обновление" doc_as_upsert => верно document_id => "% {GEOREFID}" } – banu

+0

Любой предложение для приведенных выше комментариев @ sysadmin1138 – banu

+0

@banu Если логика, которую вы ищете, * ЕСЛИ НЕВОЗМОЖНО значение THEN update *, то я предлагаю вам обернуть этот вывод 'update' в условии if, если тесты для этого нулевого значения , – sysadmin1138

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