2017-02-06 1 views
2

Versuch, ein bestimmtes Feld in elasticsearch durch logstash zu aktualisieren. Ist es möglich, nur eine Reihe von Feldern durch logstash zu aktualisieren?Logstash Aktualisierung eines Dokuments in elasticsearch

finden Sie den Code unten,

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

wir die obige Konfiguration verwenden, wenn wir dies der Nullwert-Feld verwenden entfernt zu werden, statt Nullwert Aktualisierung des Überspringens.

Daten stammen aus 2 verschiedenen Quellen. Die eine stammt aus der XML-Datei und die andere aus der JSON-Datei.

XML-Protokollformat: GEO-1 | CD | 23 | John | 892 | Kanada | 31-01-2017 | QC | - | - | - | - | - JSON-Protokollformat: GEO-1 | AS | 33 | - | - | - | - | - | Mike | 123 | US | 31-01-2017 | QC

Beim Hinzufügen eines Protokolls wird ein neues Dokument im Index erstellt. Beim Lesen der zweiten Protokolldatei sollte das vorhandene Dokument aktualisiert werden. Die Aktualisierung sollte nur in den ersten 5 Feldern erfolgen, wenn die Protokolldatei XML ist und die letzten 5 Felder, wenn die Protokolldatei JSON ist. Bitte schlagen Sie uns vor, wie Sie dies in logstash tun können.

Mit dem obigen Code versucht. Bitte überprüfen Sie und kann Ihnen jemand helfen, wie Sie das beheben können?

+0

Könnte jemand dabei helfen? – banu

+0

Sie geben nur eine Filterdefinition an, die Operation update/insert/upsert erfolgt jedoch über die Ausgabe nach elasticsearch. Sie können darüber lesen Sie hier: https://www.elastic.co/guide/en/logstash/2.4/plugins-outputs-elasticsearch.html – pandaadb

+0

@pandaadb bearbeitet die Frage. Können Sie sich bitte die Frage ansehen und helfen? – banu

Antwort

2

Damit die Elasticsearch-Ausgabe eine andere Aktion als index ausführt.

Dies sollte wahrscheinlich in eine Bedingung eingeschlossen werden, um sicherzustellen, dass Sie nur Datensätze aktualisieren, die aktualisiert werden müssen. Es ist eine weitere Option, obwohl, doc_as_upsert

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

Dies teilt die Plugin einfügen, wenn es neu ist, und zu aktualisieren, wenn es nicht ist.


Sie versuchen jedoch, zwei Eingaben zu verwenden, um ein Dokument zu definieren. Dies macht die Dinge kompliziert. Außerdem liefern Sie nicht beide Eingänge, also improvisiere ich. Um ein unterschiedliches Ausgabeverhalten bereitzustellen, müssen Sie zwei Ausgaben definieren.

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

Wenn Sie dies so konfigurieren, können Sie das ElasticSearch-Verhalten basierend auf dem Ursprung des Ereignisses ändern.

+0

Ich habe müde das obige Option Dokument wird nicht aktualisiert das NULL-Wert-Feld wird entfernt statt Null-Wert-Update zu überspringen. Elasticsearch { hosts => [ "localhost: 9200"] Index => "logstash-data-Monitor" action => "update" doc_as_upsert => true document_id => "% {GEOREFID}" } – banu

+0

All Vorschlag für die obigen Kommentare @ sysadmin1138 – banu

+0

@banu Wenn die Logik, die Sie suchen, ist, wenn NULL Null-Wert DANN aktualisieren *, dann schlage ich vor, dass Sie die 'update'-Ausgabe in eine If-Bedingung, die für diesen Nullwert testet . – sysadmin1138

Verwandte Themen