Fluentdで、RailsのログをS3に保存する方法


## What is fluentd?
- ログ収集をプログラマブルに実施し、状況に応じた柔軟な対応が実現できるソフトウェア
- ログの管理を「インプット」「バッファ」「アウトプット」という3つの層に分けて管理
- fluentdは内部で各ログデータに対して「タグ」を付与し、管理
- fluentdではログの内容（レコード）がJSON形式になっている
	- そのため、アプリケーション側でのパースが容易であるというメリットがある

## Why Fluentd? : ログ管理への要求
- ログの多様化・肥大化への対応
- ログ情報を基にした分析の必要性

## fluentdの設定方法

### インストール方法
様々なインストール方法がある

- RPMパッケージからFluentdをインストールする (Redhat Linux)
- DEBパッケージからFluentdをインストールする (Debian / Ubuntu Linux)
- DMGパッケージからFluentdをインストールする (Mac OS X)
- Ruby GemからFluentdをインストールする
- ChefでFluentdをインストールする
- ソースコードからFluentdをインストールする

[インストール | Fluentd](http://docs.fluentd.org/ja/categories/installation)

#### Gemからインストールする場合
- gemの場合は、/etc/init.d/ にスクリプトは作られません
- daemontools, runit, supervisord, またはupstartのようなプロセス管理ツールを使う必要があります

```
$ gem install fluentd
$ fluentd --setup ./fluent
$ fluentd -c ./fluent/fluent.conf -vv &
$ echo '{"json":"message"}' | fluent-cat debug.test
```

#### RPMパッケージからFluentdをインストールする場合
- td-agentは、fluentdを稼働させるために必要なRubyインタープリターを含んだ安定版パッケージ

##### Install td-agent

[Installing Fluentd Using rpm Package | Fluentd](http://docs.fluentd.org/articles/install-by-rpm)

[Overview of Streaming Import by Treasure Agent (td-agent) | Treasure Data](http://docs.treasuredata.com/articles/td-agent#install-td-agent)

### Pluginのインストール

```
$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-parser
$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-s3
```

### Configure

```
sudo vi /etc/td-agent/td-agent.conf
```

#### インプットプラグインに関する設定

```
<source>
  type forward
  port 24224
</source>
```

#### アウトプットプラグインに関する設定
- s3にログをアウトプットする設定を記述
- ```buffer_path```で、一時的にログをバッファしておく場所を指定
- ```flush_interval```を設定することで、バッファされていたログをS3に吐き出す間隔を設定可能
	- ```time_slice_wait```で設定しても良いのかもしれません

```
<match foo>
  type parser
  key_name messages
  format json
  tag rails
</match>
<match rails>
  type s3

  aws_key_id AWS_KEY_ID
  aws_sec_key AWS_SEC_ID
  s3_bucket foo-log
  s3_endpoint s3.amazonaws.com
  s3_object_key_format %{path}%{time_slice}_%{index}_%{hostname}.%{file_extension}
  path logs/
  buffer_path /var/log/td-agent/buffer/s3

  flush_interval 60s
  time_slice_format %Y%m%d/%Y%m%d-%H
</match>
```

[fluent/fluent-plugin-s3](https://github.com/fluent/fluent-plugin-s3)

[30分でできる！オブジェクトストレージへのログ保存（fluentd編） | IDC Frontier Engineers' Blog](http://www.idcf.jp/blog/storage/log_fluentd/)

[S3とFluentdを用いた効率的なログ管理 | SmartNews開発者ブログ](http://developer.smartnews.be/blog/2013/09/02/an-effective-log-management-technique-which-uses-fluentd-and-s3/)

### Fluentdの起動・停止方法

```
$ /etc/init.d/td-agent start
$ /etc/init.d/td-agent stop
$ /etc/init.d/td-agent restart
$ /etc/init.d/td-agent status
```

## with Rails
- ```Gemfile```に以下のGemを追加

```
gem 'act-fluent-logger-rails'
gem 'lograge'
```

- ```application.rb```に以下を追加

```
    config.log_level = :info
    config.logger = ActFluentLoggerRails::Logger.new
    config.lograge.enabled = true
    config.lograge.formatter = Lograge::Formatters::Json.new
```

- ```config/fluent-logger.yml```を編集

```
development:
  fluent_host:   '127.0.0.1'
  fluent_port:   24224
  tag:           'foo'
  messages_type: 'string'

test:
  fluent_host:   '127.0.0.1'
  fluent_port:   24224
  tag:           'foo'
  messages_type: 'string'

production:
  fluent_host:   'xxx.yyy.zzz.xxx'
  fluent_port:   24224
  tag:           'foo'
  messages_type: 'string'
```

- 環境変数に```FLUENTD_URL```を設定することでも対応可能
	- 今回は、複数台のサーバーで運用するため、こちらを採用し、サーバー毎にhost変数を設定した

```
export FLUENTD_URL='http://xxx.yyy.zzz.xxx:24224/foo?messages_type=string'
```

[Collecting and Analyzing Ruby on Rails Logs | Fluentd](http://www.fluentd.org/datasources/rails)

[fluentd+rails+mongoでサクッとログ環境を整備してみる - dev.log](http://shmztkyk.hatenablog.com/entry/2013/11/14/162601)

[Streaming Import from Rails Apps | Treasure Data](http://docs.treasuredata.com/articles/rails)

## Refs.

[fluent/fluentd](https://github.com/fluent/fluentd)

[actindi/act-fluent-logger-rails](https://github.com/actindi/act-fluent-logger-rails)

[fluent/fluent-logger-ruby](https://github.com/fluent/fluent-logger-ruby)

[今さら聞けないfluentd～クラウド時代のログ管理入門（1）：増えるログ、多様化するログをどう効率的に運用するか (1/2) - ＠IT](http://www.atmarkit.co.jp/ait/articles/1402/06/news007.html)

[今さら聞けないfluentd～クラウド時代のログ管理入門（2）：fluentdと定番プラグインのインストール (1/2) - ＠IT](http://www.atmarkit.co.jp/ait/articles/1403/05/news012.html)

[今さら聞けないfluentd～クラウド時代のログ管理入門（3）：fluentdの効果的な活用例と安定運用のポイント (1/3) - ＠IT](http://www.atmarkit.co.jp/ait/articles/1404/04/news004.html)

[柔軟なログ収集を可能にする「fluentd」入門 - さくらのナレッジ](http://knowledge.sakura.ad.jp/tech/1336/)

[柔軟なログ収集を可能にする「fluentd」入門 - さくらのナレッジ - Part 2](http://knowledge.sakura.ad.jp/tech/1336/2/)

[柔軟なログ収集を可能にする「fluentd」入門 - さくらのナレッジ - Part 3](http://knowledge.sakura.ad.jp/tech/1336/3/)

[導入手順 - Fluentdにおけるログ運用 - Qiita](http://qiita.com/kenzan100/items/9891a24263de77af6f31)

[fluentdの簡単な使い方、設定方法一覧 - Hive Color](http://hivecolor.com/id/37)