2017-02-06 13 views
2

elasticstarchの特定のフィールドをlogstashで更新しようとしています。 logstashによって一連のフィールドのみを更新することは可能ですか?Logstash elasticsearchで文書を更新する

我々はNULL値フィールドは削除の代わりにNULL値の更新をスキップ取得され、これを使用するときに私たちは、上記の構成を使用している

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つの異なるソースから来ています。 1つはXMLファイルからのもので、もう1つはJSONファイルからのものです。

XMLログ形式:GEO-1 | CD | 23 | John | 892 |カナダ| 31-01-2017 | QC | - | - | - | - | - JSONログ形式:GEO-1 | AS | 33 | - | - | - | - | - | Mike | 123 | US | 31-01-2017 | QC

1つのログを追加すると、新しい文書がインデックスに作成されます。 2番目のログファイルを読むとき、既存の文書は更新されるべきです。更新は、ログファイルがXMLの場合は最初の5つのフィールドで、ログファイルがJSONの場合は最後の5つのフィールドでのみ発生します。 logstashでこれを行う方法をお教えください。

上記のコードを試してみてください。確認してください、これを修正する方法について助けてくれる人はいますか?

+0

誰か助けてもらえますか? – banu

+0

フィルタ定義のみを提供しますが、update/insert/upsert操作は、elasticsearchの出力を介して行われます。あなたはそれについてここで読むことができます:https://www.elastic.co/guide/en/logstash/2.4/plugins-outputs-elasticsearch.html – pandaadb

+0

@pandaadbが質問を編集しました。あなたは質問を見て、これについて助けてください。 – banu

答えて

2

indexyou need to tell it to do something else以外のアクションを実行するElasticsearch出力の場合。

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

これはおそらく、更新が必要なレコードのみを更新するための条件付きで囲む必要があります。別のオプションは、それがない場合は

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

これdoc_as_upsertは、それが新規の場合、挿入するプラグイン、および更新を通知します、しかし、があります。


ただし、2つの入力を使用してドキュメントを定義しようとしています。これは事態を複雑にします。また、両方の入力を提供しているわけではないので、私は即興で説明します。異なる出力動作を提供するには、2つの出力を定義する必要があります。

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 { ホスト=> [ "はlocalhost:9200"] インデックス=> "logstashデータモニタ" アクション=> "更新" doc_as_upsert =>真 DOCUMENT_ID => "%{GEOREFID}" } – banu

+0

任意上記のコメントのための提案@ sysadmin1138 – banu

+0

@banuもしあなたが探しているロジックが* IF NOT NULL value THEN update *ならば、そのヌル値をテストするif条件にその 'update'出力をラップすることをお勧めします。 – sysadmin1138

関連する問題