Logstash Обновить документ в elasticsearch

Попытка обновить определенное поле в elasticsearch через logstash. Можно ли через logstash обновить только набор полей?

Пожалуйста, найдите код ниже,

    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}"
  }
}

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

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

Формат журнала XML: GEO-1 | CD | 23 | John | 892 | Канада | 31-01-2017 | QC | - | - | - | - | - Формат журнала JSON: GEO-1 | AS | 33 | - | - | - | - | - | Майк | 123 | США | 31-01-2017 | QC

При добавлении одного журнала в индекс будет создан новый документ. При чтении второго файла журнала необходимо обновить существующий документ. Обновление должно происходить только в первых 5 полях, если файл журнала - XML, и последних 5 полях, если файл журнала - в формате JSON. Пожалуйста, посоветуйте нам, как это сделать в logstash.

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


person banu    schedule 06.02.2017    source источник
comment
Может ли кто-нибудь помочь в этом?   -  person banu    schedule 06.02.2017
comment
Вы предоставляете только определение фильтра, однако операция обновления / вставки / вставки выполняется через вывод в elasticsearch. Вы можете прочитать об этом здесь: elastic.co/guide /en/logstash/2.4/   -  person pandaadb    schedule 06.02.2017
comment
@pandaadb отредактировал вопрос. Не могли бы вы взглянуть на вопрос и помочь в этом?   -  person banu    schedule 06.02.2017


Ответы (1)


Чтобы выходные данные Elasticsearch выполняли любое действие, кроме index вам нужно указать ему сделать что-то еще.

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 в зависимости от того, где возникло событие.

person sysadmin1138    schedule 06.02.2017
comment
Я устал, что вышеуказанный документ с опциями не обновляется, поле нулевого значения удаляется вместо пропуска обновления нулевого значения. elasticsearch {hosts = ›[localhost: 9200] index =› logstash-data-monitor action = ›update doc_as_upsert =› true document_id = ›% {GEOREFID}} - person banu; 07.02.2017
comment
Любые предложения по приведенным выше комментариям @ sysadmin1138 - person banu; 13.02.2017
comment
@banu Если вы ищете логику IF NOT null-value THEN update, то я предлагаю вам обернуть этот update вывод в условное if, которое проверяет это нулевое значение. - person sysadmin1138; 13.02.2017
comment
не могли бы вы предоставить мне образец условия по этому поводу? - person banu; 14.02.2017
comment
@banu Я обновил пример условного. - person sysadmin1138; 14.02.2017
comment
@ sysadmin1138, пожалуйста, найдите обновленный вопрос для вашего состояния. - person banu; 16.02.2017
comment
@ sysadmin1138, как logstash узнает, обновляю ли я данные в MongoDB? он автоматически идентифицируется и обновляется на сервере ES? - person Bala venkatesh; 29.04.2020