Fluentdにおけるログ運用


##Fluentdとは
* こんな感じ (引用: http://codezine.jp/static/images/article/6958/6958_02.gif)

![fluentd](http://codezine.jp/static/images/article/6958/6958_02.gif)

##セットアップ
* Railsのログと、ウェブサーバの標準的なログを、S3に集約する構成
* fluentdのエージェントのインストールは、下記URLから、各ディストリビューション別にチュートリアル閲覧可能
* http://docs.treasuredata.com/articles/td-agent#install-td-agent

###conf

```td-agent.conf
<match *.**>
  type forest
  subtype s3

  <template>
   aws_key_id xxx #IAMでS3への書き込み権限をもったものを指定(後述)
   aws_sec_key xxx #IAMでS3への書き込み権限をもったものを指定(後述)
   s3_bucket fluentd-logging
   path others/
   buffer_path /var/log/td-agent/buffer/${tag}

   time_slice_format ${tag}/%Y%m%d%H
   time_slice_wait 10m
   flush_interval 1m

   format_json true
   include_time_key true
   include_tag_key true

   buffer_chunk_limit 256m
  </template>
</match>

<source>
 type forward
</source>

<source>
 type config_expander
 <config>
  type tail
  format apache2
  path /var/log/httpd/access_log
  pos_file /var/log/td-agent/apache2.access_log.pos
  tag ${hostname}/apache.access
 </config>
</source>

<source>
 type config_expander
 <config>
  type tail
  format /^\[[^ ]* (?<time>[^\]]*)\] \[(?<level>[^\]]*)\] \[pid (?<pid>[^\]]*)\] \[client (?<client>[^\]]*)\] (?<message>.*)$/
  path /var/log/httpd/error_log
  pos_file /var/log/td-agent/apache2.error_log.pos
  tag ${hostname}/apache.error
 </config>
</source>

<source>
 type config_expander
 <config>
  type tail
  format syslog
  path /var/log/messages
  pos_file /var/log/td-agent/syslog.messages.pos
  tag ${hostname}/syslog.messages
 </config>
</source>

<source>
 type config_expander
 <config>
  type tail
  format syslog
  path /var/log/cron
  pos_file /var/log/td-agent/syslog.cron.pos
  tag ${hostname}/syslog.cron
 </config>
</source>

<source>
 type config_expander
 <config>
  type tail
  format syslog
  path /var/log/secure
  pos_file /var/log/td-agent/syslog.secure.pos
  tag ${hostname}/syslog.secure
 </config>
</source>
```

```Gemfile
gem 'act-fluent-logger-rails', '0.0.4' #まだ自社環境が Rails3系だったので、0.0.4を指定
```

```config/fluent-logger.yml
development:
  fluent_host: '0.0.0.0'
  fluent_port: 24224
  tag: 'rails.log'
  messages_type: 'string'

staging:
  fluent_host: '0.0.0.0'
  fluent_port: 24224
  tag: 'rails.log'
  messages_type: 'string'

production:
  fluent_host: '0.0.0.0'
  fluent_port: 24224
  tag: 'rails.log'
  messages_type: 'string'
```

```environments/production.rb
  config.log_level = :info
  config.logger = ActFluentLoggerRails::Logger.new
```

##権限の変更
* ログの収集のために権限を設定: http://dev.classmethod.jp/cloud/amazon-linux-fluentd-setup-plugin/
* IAMロールで、特定のS3バケットへの書き込み権限を設定: https://github.com/fluent/fluent-plugin-s3#iam-policy

##ハマり所

* S3へのアップロードタイミング
* flush_intervalを指定しないと、下記のタイミングでアップロードされる

```
WARNING: By default, files are created on an hourly basis (around xx:10). This means that when you first import records using the plugin, no file is created immediately. The file will be created when the time_slice_format condition has been met. To change the output frequency, please modify the time_slice_format value. To write files every minute, please use %Y%m%d%H%M for the time_slice_format.
```

##収集の設計を考える

###収集ポイント

####Railsアプリケーションログ
* https://github.com/fluent/fluent-logger-ruby
* https://github.com/actindi/act-fluent-logger-rails (0.0.4までが Rails3.* 系)

####Apache
* access_log: http://docs.fluentd.org/articles/apache-to-s3
* error_log: http://www.stormacq.com/storing-apache-access-and-error-logs-to-amazon-s3-with-fluentd/


###ログ集約
* Apacheのログ集約設定 参考になりそう https://gist.github.com/vananasian/4215057

###活用
* とりあえずつっこんで、後でEMRでがんばる
  * http://dev.classmethod.jp/cloud/aws/query-fluentd-logfiles-on-s3-with-emr/
* Redshiftはなんか難しそう。高そう．．
  * http://gihyo.jp/dev/serial/01/redshift
  * http://dev.classmethod.jp/cloud/aws/getting-started-redshift-1st-half/
  * https://github.com/hapyrus/fluent-plugin-redshift
  * http://developer.smartnews.be/blog/2013/10/03/easy-data-analysis-using-fluentd-redshift-and-tableau/
* MongoDBなら、Capping Collectionで、DB上でデータベースの上限を決めれるので、「直近のDBは高速で検索」「それ以前のデータはS3(さらに以前のデータはGlacier)で管理だけ」だと、良い感じな気がする。その方が設計方針もだんだんと決めれそう
  * http://www.mongohq.com/pricing/
* あとは、elasticsearchでという選択肢も。これも簡単そう。
  * http://docs.fluentd.org/recipe/apache-logs/elasticsearch

##またあとで
* 分析を見越した各ログフォーマットの調整
* 実際になにでデータ分析するか