Fluentd + Elasticsearch +Kibanaを導入したので手順をメモ
導入経緯
「serverのログ見るときに複数のserverにsshで入って見るのとかつらめ」
という理由からリアルタイムで集められたら幸せになれるのではと考え、
fluentdを使ってみようとい結論に至った訳です。
なぜfluentdにしたのか
他にもflume(良く知らない)とかあるのになぜfluentdにしたかと言うと下記の理由から
リアルタイムログ解析もしてみる
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の設定は終わりー
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の画面が表示されるはずです。
抜けている部分があるかもしれませんが
こんな感じで導入は終了です。
fluentのconfの設定をいじって各々の環境や要件に合わせたログ収集を行えば幸せになれるのではないでしょうか
fluentのその他の設定は下記を参考にしてください。