Ruby
fluentd
S3
NIJIBOXDay 11

fluentdでログをS3に送るとき, ホスト名をパスに含める

More than 1 year has passed since last update.

はじめに

こんにちは。
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-fileyour-bucket/bar/your-file のようなパスに保存できます。

まとめ

他にも似たようなプラグインはありましたが、今回はこれが一番使いやすかったです。他にも方法はありそうですが、参考までに〜〜

参考

http://y-ken.hatenablog.com/entry/fluentd-how-to-use-tag_parts-placeholder