![[小ネタ]fluent-plugin-aws-elasticsearch-serviceにて、重複行を登録させない設定](https://devio2023-media.developers.io/wp-content/uploads/2016/09/fluentd.png)
[小ネタ]fluent-plugin-aws-elasticsearch-serviceにて、重複行を登録させない設定
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
コンニチハ、千葉です。
fluent-plugin-aws-elasticsearch-serviceを利用してAmazon Elasticsearch Serviceへログを登録している環境があります。この環境でログを再送した時に同じログが数十件登録されました。具体的には、2万件ほどリダイレクトでログを書き込んでみたところ、同じログが10行から15行程登録されていました。これは困った。
ということで、ログを重複させない方法を調査してみました。
どうやるの?
まず前提として、Elasticsearchには_idというフィールドが有り、ドキュメントの一意なIDとなります。このフィールドに一意なIDを指定することで重複を避けられそうです。(同じIDが送信された場合上書きされます)
そしてログに一意なID、request_idを追加しておきます。この一意なrequest_idを、ドキュメントのID_idに指定することで、同じrequest_idが送信された場合、上書きされるので、結果重複行をなくすことができそうです。
ログの例
{"timestamp":"2016-07-31T09:00:13.911+0900","request_id":"1234-1234-1234-1234-1234-111","msg":"test1"}
{"timestamp":"2016-07-31T10:00:13.911+0900","request_id":"1234-1234-1234-1234-1234-222","msg":"test2"}
{"timestamp":"2016-07-31T10:00:13.911+0900","request_id":"1234-1234-1234-1234-1234-333","msg":"test3"}
設定
fluent-plugin-aws-elasticsearch-serviceにはid_keyというパラメータが有ります。ここに、ESのフィールドを指定できるので、今回の例のログで一意なrequest_idを指定します。
<source>
  type tail
  path xxx.log
  pos_file xxx.pos
  format json
  tag aws-es
</source>
<match aws-es>
  type "aws-elasticsearch-service"
  type_name "xxx"
  index_name xxx
  id_key request_id
  flush_interval 60s
  resurrect_after 5s
  reload_connections false
  <endpoint>
    url https://xxxx.ap-northeast-1.es.amazonaws.com
    region ap-northeast-1
  </endpoint>
</match>
ログをputしてみる

request_idが_idとして登録されていることが確認できました!
最後に
これで重複登録が避けられそうです。基本的なことかもしれませんが、ログに一意なIDがある場合は、id_keyを指定したほうがよさそうです。 それでは、また。













