Unicornで動かしたRailsのログをtd-agent に流してS3にアップロードする

https://raw.githubusercontent.com/fluent/fluentd-docs/master/public/logo/Fluentd_square.png

td-agentのログはアプリサーバーにおいて置くと膨大になってしまいます。 RailsアプリのログをS3に流してあとで分析できるようにします。

S3との連携プラグインをいれる

gem install fluent-plugin-s3

/etc/td-agent/td-agent.conf に設定ファイルを置く

<source>
  @type tail
  path /home/deploy/apps/myapp/shared/log/unicorn.log
  tag rails.production
  pos_file /var/log/td-agent/rails.production.pos
  format /^(?<log_initial>.*), \[(?<date>\d{1,4}-\d{1,2}-\d{1,2}T\d{1,2}:\d{1,2}:\d{1,2}.\d{1,6}) (?<process_id>[^ ]*)\] *(?<log_level>[^ ]*) -- : \[(?<request_id>[^ ]*)\] (?<message>[^\']*[^\]]*)/
</source>

<match rails.production>
  @type stdout
</match>

何を受け取るか入力元の指定は<source> ディレクティブで行います.

<souce>ディレクティブの情報に対する出力処理は<match>ディレクティブで行います.

Railsアプリをunicornで動かして、それが吐き出すログ log/unicorn.log を読み込むという動作なのですが、このとき、rails側で利用するS3と一緒のリージョンじゃないと Please configure the proper region to avoid multiple unnecessary redirects and signing attempts というエラーになって、うまく動きませんでした。

EC2 にポリシーをアタッチ

Iam のパネルにAWSの管理画面から移動、ロールとしてS3 full access を作成します。

EC2の画面に移動し、「アクション>ロールのアタッチ」から先ほど作成したロールをアタッチします。

td-agentにS3の設定を記載する

buffer_pathを指定しないとエラーが出ました。

<match rails.production>
  @type s3
  s3_bucket bucketname #ご自由に
  s3-region us-east-1 #ご自由に
  time_slice_format %Y%m%d%H%M
  buffer_path /var/log/td-agent #ないとエラーが出た
  time_slice_wait 10m
  buffer_chunk_limit 256m
</match>

EC2にロールを付与していれば、ここにAWS_ACCESS_KEYなどを記載する必要はないです。

再起動

/etc/init.d/td-agent restart

ログの確認

sudo tail -f /var/log/td-agent/td-agent.log