この記事は公開されてから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を指定したほうがよさそうです。 それでは、また。