はじめに
こんにちは。
fluentdでログをS3に送るとき、ホスト名をパスに含みたいことがあったので、そのときのメモです。
例えば foo.baz.com
からのログであれば、 S3の your-bucket/foo.baz.com/your-file
に、bar.baz.com
からのログであれば、 your-bucket/bar.baz.com/your-file
などのパスに保存できます。
やり方
fluent-plugin-record-reformerというプラグインを使います。このプラグインは、レコード中のフィールドを書き換えるもので、以下のようにホスト名をタグに付け、タグをプレフィックスに指定します。
# ホスト名をタグに付ける
<match your.tag>
type record_reformer
renew_record false
enable_ruby true
tag ${tag_parts[1]}.${tag_parts[2]}.${record['Host']}
</match>
# ログをS3に送る
<match your.tag.*>
type forest
subtype s3
remove_prefix your
remove_prefix tag
<template>
aws_key_id your-key
aws_sec_key your-sec-key
s3_bucket your-bucket
s3_region your-region
path your-bucket/${tag}/
buffer_path /var/log/td-agent/buffer/${tag}
time_slice_format your-format
flush_interval 60m
buffer_chunk_limit 512m
</template>
</match>
かんたんに解説
-
${tag_parts}
: 入力されたタグが入っています -
${record}
: レコード内のデータが入っています。${record['Host']}
とするとホスト名が取れます -
enable_ruby
: trueにすると簡単なRuby式が書けます - ↑のような方法でホスト名をタグに付与し、S3に送るときに
${tag}
でタグをパスに指定します
使用例
サブドメインを使っているシステムでは、サブドメインごとにログを保存するパスを変えたいこともあるかと思います。そのときはタグを付与する部分を以下のように変えます。
# ホスト名をタグに付ける
<match your.tag>
type record_reformer
renew_record false
enable_ruby true
tag ${tag_parts[1]}.${tag_parts[2]}.${record['Host'] ? record['Host'].split(".")[0] : '-'}
</match>
とかんたんなRuby式を書くことで、サブドメイン部分のみ取り出して、タグに含めることができます。そして your-bucket/foo/your-file
や your-bucket/bar/your-file
のようなパスに保存できます。
まとめ
他にも似たようなプラグインはありましたが、今回はこれが一番使いやすかったです。他にも方法はありそうですが、参考までに〜〜
参考