まっしろけっけ

めもてきなやーつ

Fluentd + Elasticsearch +Kibanaを導入したので手順をメモ

導入経緯

「serverのログ見るときに複数のserverにsshで入って見るのとかつらめ」
という理由からリアルタイムで集められたら幸せになれるのではと考え、
fluentdを使ってみようとい結論に至った訳です。

なぜfluentdにしたのか

他にもflume(良く知らない)とかあるのになぜfluentdにしたかと言うと下記の理由から

  • Rubyで実装されているのでカスタマイズとかプラグイン作る場合も作りやすいかな
  • gemとして提供されているのでRubyプロジェクトでは導入しやすいかな
  • プラグインがいっぱいある
  • RubyKaigiでそのっつさんの下記のお話を聞いていたりで使ってみたかったとかそんな感じ

Fluentd Hacking Guide at RubyKaigi 2014

リアルタイムログ解析もしてみる

Fluentdを使うならElasticserchとKibanaも導入してリアルタイムログ解析も楽しそうなので導入を決定

Fluentdのセットアップ

今回はnginxのアクセスログRailsのアプリケーションログの中のエラーを抽出してAggregatorに集約したいと思います。
セットアップ前にちょっとfluentdについて説明
いくつかの種類のノードがあるので今回関係あるものを軽く説明

Forwarder

Aggregatorにイベントを送信するノード

Aggregator

各Forwarderから送られるイベントを集約する為のノード

セットアップ

今回はgemを使ってセットアップしますが他にもrpmパッケージからのインストール等複数の選択肢がありますので
下記を参考にしてください。
http://docs.fluentd.org/ja/categories/installation
Ruby等は既にinstallしている前提です。
Rubyのinstallは過去記事をご覧ください。

ForwarderとAggregatorで実行

$ gem install yajl-ruby --platform=ruby # gem install fluentdで正常にinstallできない場合があったので実行
$ gem install fluentd
$ fluentd --setup ~/fluent # ~/fluentdのディレクトリにfluentd用の設定ファイル等を作成する
$ fluentd -c ./fluent/fluent.conf -vv & # 設定ファイルを指定し起動
$ echo '{"json":"message"}' | fluent-cat debug.test # 動作テスト
2014-11-29 17:27:09 +0000 debug.test: {"json":"message"} # こんな感じのログが出力されるはず


Forwarderのconf設定

$ vi ~/fluent/fluent.conf
# Nginx access logの設定
<source>
  type tail # 
  path /var/log/nginx/access.log # nginxのaccess logのpath
  format nginx # fileのフォーマット
  tag nginx.access # tag名
  pos_file /var/log/fluent/nginx.access.pos # position fileを保存しておくpath
</source>

# Rails errorの設定
<source>
  type tail
  path RAILS_ROOT/log/rails.log # Railsのlogのpath指定
  format multiline # 複数行のログを送りたいときに指定
  format_firstline /.*[eE]rror.*/ # Errorもしくはerrorを含む行からformatNの条件を満たすログまでを送信する
  format1 /(?<error>.*[eE]rror.*)\n\n/ # 改行が連続している部分まで送信する
  tag rails.error # tag名
  pos_file /var/log/fluent/rails.error.pos # position fileを保存しておくpath
</source>

<match *.*> # この条件にmatchするtagを下記の条件でごにょごにょする
  type forward
  buffer_type memory # Fluentdの内部バッファリングにmemoryを使用
  buffer_chunk_limit 256m # チャンクのサイズ
  buffer_queue_limit 128 # チャンクキューの長さ
  flush_interval 5s # データフラッシュの間隔
  <server>
    host aggregator_host # aggregatorのIP
    port aggregator_port # aggregatorのfluentの使用portを指定
  </server>
</match>

Aggregatorのconf設定
今回はelasticsearchへの送信とlocalにlog fileとして保存を行う設定です。

$ vi ~/fluent/fluent.conf
<source>
  type forward
  port aggregator_port
</source>

# tag名がnginx.*の設定
<match nginx.*>
  type copy
  <store>
    index_name nginx
    type_name nginx
    type elasticsearch
    include_tag_key true # tag keyの設定
    tag_key @log_name # tag key名
    host localhost # elasticsearchのhost
    port 9200 # elasticsearchのport
    logstash_format true # Kibana用にlogstashフォーマットで出力するオプション
    flush_interval 3s
  </store>

  # localに保存したいので設定
  <store>
    type file
    path /var/log/fluent/nginx.access_log # 保存する際のpath
  </store>
</match>

# tag名がrails.*の設定
<match rails.*>
  type copy
  <store>
    index_name rails
    type_name rails
    type elasticsearch
    include_tag_key true
    tag_key @log_name
    host localhost
    port 9200
    logstash_format true
    logstash_prefix rails
    flush_interval 3s
  </store>

  # localに保存したいので設定
  <store>
    type file
    path /var/log/fluent/rails.access_log # 保存する際のpath
  </store>
</match>


Aggregatorでpluginのinstall

$ fluent-gem install fluent-plugin-elasticsearch
# fluent-gemのコマンドが無いって言われた場合
$ vi ~/.bashrc
+ export PATH="$HOME/.rbenv/versions/2.x.x/bin/:$PATH" # rubyのversionは環境に合わせて変更
$ source ~/.bashrc

confを更新したのでfluentを再起動します。
以上でfluentの設定は終わりー

fluent.confのformatに関して

Forwarderのconfのformatに関してですが
formatで設定された正規表現を使ってログの文字列に対してRubyのmatchを使っているイメージ
なのでRuby正規表現の名前付きキャプチャ等を理解していると設定が楽になるかと思います。

Elasticsearchのセットアップ

今回はAggregatorのserverでelasticsearchを動作させる

$ sudo yum install curl-devel java-1.7.0-openjdk
# elasticsearchもyumでinstallする
$ sudo vi /etc/yum.repos.d/elasticsearch.repo
+ [elasticsearch-1.3]
+ name=Elasticsearch repository for 1.3.x packages
+ baseurl=http://packages.elasticsearch.org/elasticsearch/1.3/centos
+ gpgcheck=1
+ gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
+ enabled=1
$ sudo yum install elasticsearch

Kibanaのセットアップ

kibanaもAggregatorのserverにいれる
kibanaへのアクセスはnginxを使うのでnginxも一緒に入れるよ

nginxのセットアップ
$ sudo yum install nginx
$ vi /etc/nginx/conf.d/kibana.conf
server {
    server_name localhost;

    location /kibana/ {
         root /usr/share/nginx/html;
         index index.html index.htm;
    }
}
kibanaのセットアップ
$ wget https://download.elasticsearch.org/kibana/kibana/kibana-3.1.1.tar.gz
$ tar xvzf kibana-3.1.1.tar.gz
$ mv kibana-3.1.1 /usr/share/nginx/html/kibana
$ cd /usr/share/nginx/html/kibana
$ vi config.js 
# 32行目 elasticsearch: "http://"+window.location.hostname+":9200",
# 上記をAggregatorのhost nameに変更

動作確認

設定が完了したのでAggregatorでミドルウェアを起動させる

$ sudo /etc/init.d/nginx start
$ sudo /etc/init.d/elasticsearch start

これでhttp://aggregator_host/kibanaにアクセスするとこのようにkibanaの画面が表示されるはずです。f:id:shiro-16:20141130033707p:plain


抜けている部分があるかもしれませんが
こんな感じで導入は終了です。
fluentのconfの設定をいじって各々の環境や要件に合わせたログ収集を行えば幸せになれるのではないでしょうか
fluentのその他の設定は下記を参考にしてください。