Pocket

こんにちは。根本です。

今日はfluend+elasticsearch+kibanaを使ったログの可視化をサクッと構築してみようかと思います。

今回の目的は、とりあえずサクッ!と可視化すること。
なので、セキュリティが云々ってのは勘弁してください。
まずは動いているものを見てみることで、それぞれの環境で構成は拡張してもらえればよいかと。

構成は以下とします。

構成_1

ただ実際には、kibanaは静的コンテンツであり、動的にelasticsearchからデータ取得し、ブラウザ側で解析・生成する。という仕組みな為、以下のようなイメージですかね。

構成_2

必要な作業は以下。
(今回の視覚化のターゲットはapacheのaccessログを対象としています。apacheが起動していることを前提とさせて下さい。)

  • elasticsearchセットアップ
  • kibanaセットアップ
  • fluentdセットアップ

では早速。

elasticseachセットアップ

構成_3

elasticsearchを起動するにはJavaが必要なので、JDKをインストールします。

(今回は ${HOME}/usr/local に展開しています)

(既にJAVA_HOMEが設定されている場合には省略)

wget --no-check-certificate --no-cookies - --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u25-b17/jdk-8u25-linux-x64.tar.gz

tar -zxvf jdk-8u25-linux-x64.tar.gz -C ${HOME}/usr/local

export JAVA_HOME=${HOME}/usr/local/jdk1.8.0_25
export PATH=${JAVA_HOME}/bin:${PATH}

java -version
  # java version "1.8.0_25"
  # Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
  # Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)

次にelasticsearch。

(今回は ${HOME}/etc に展開しています)

wget -O elasticsearch-1.4.1.tar.gz "https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.4.1.tar.gz?_ga=1.94189149.1596253905.1415627857"

tar -zxvf elasticsearch-1.4.1.tar.gz -C ${HOME}/etc

export PATH=${HOME}/etc/elasticsearch-1.4.1/bin:${PATH}
elasticsearch

起動しました?
defaultではポート番号が 9200 で立ち上がっています。
curl コマンドで動作確認しときます。

curl 'localhost:9200/_cat/health?v&ts=0'
  # epoch      timestamp cluster       status node.total node.data shards pri relo init unassign
  # 1417615287 23:01:27  elasticsearch green           1         1      0   0    0    0        0

statusが green 、clusterが elasticsearch であるなど確認できます。

動作確認したとこで、とりあえずこれは一旦置いときます。

kibanaセットアップ

構成_4

今回は、とりあえずaccessログが見たいので、起動しているapacheのDocumentRootにいれとくだけでOK。

wget -O kibana-3.1.2.tar.gz "https://download.elasticsearch.org/kibana/kibana/kibana-3.1.2.tar.gz?_ga=1.131937103.1596253905.1415627857"

tar -zxvf kibana-3.1.2.tar.gz -C /var/www/html
ln -sin /var/www/html/kibana-3.1.2 /var/www/html/kibana

インストールは以上。

早速kibanaにアクセスしてみてください。

http://<xxx.xxx.xxx.xxx>/kibana

kibana_1

kibanaにアクセスしてみると上記のように表示されると思います。
画面の指示に従って、elasticsearchの設定に以下を追加してください。

  • ${HOME}/etc/elasticsearch-1.4.1/config/elasticsearch.yml
      http.cors.enabled: true
    

elasticsearch再起動後、再度kibanaにアクセスしてください。
以下のようにみえたでしょうか?

kibana_2

この画面が表示されたなら、Sample Dashboard のリンクをクリック。

kibana_3

データが表示されませんが、これはまだelasticsearchにデータがない為です。

ちなみに、elasticsearchが起動していないなど、elasticsearchと接続できていない場合には、
Connection Failedの画面が表示されます。

この画面が表示されているということは、
elasticsearchとの疎通確認はOKと判断出来ます。

さて、上記画面が確認できましたら、これも一旦置いときます。

最後にfluentdをセットアップします。

fluentdセットアップ

今回、fluendのインストールは gem で行うため、Rubyをインストールします。

(既に gem が実行できる環境であれば、省いてよいです。)

(今回は ${HOME}/usr/local に展開しています)

wget http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.5.tar.gz
tar -zxvf ruby-2.1.5.tar.gz
cd ruby-2.1.5

./configure --prefix=${HOME}/usr/local/ruby-2.1.5
make
make install

export PATH=${HOME}/usr/local/ruby-2.1.5/bin:${PATH}

Rubyのインストールが完了したら、引き続き fluentd をインストールです。

(今回は ${HOME}/etc に初期設定ファイルを展開しています。)

gem install fluentd --no-rdoc --no-ri

mkdir -p ${HOME}/etc/fluent
fluentd --setup ${HOME}/etc/fluent

では設定です。

今回は、accessログの出力を可視化していくことが目的なのですが、

まずは、elasticsearchに投入する前に、どのようなデータが流し込まれるかを標準出力(ログ)に出力し、確認してみます。

構成_5

  • ${HOME}/etc/fluent/fuent.conf
    <source>
      type tail
      path /etc/httpd/logs/access_log
      tag apache.access.log
      pos_file /root/etc/fluent/httpd-access.log.pos
      format apache2
    </source>
    
    <match apache.access.log>
      type stdout
    </match>  
    

設定を軽く説明しますと、path で指定したファイルをこの設定では逐次監視します。

formatでは apache2 としています。これはデフォルトで定義されているテンプレート使用しています。

(WEBアプリのAPIのログなどを監視したい場合には、正規表現で記述することも可能です。)

その抽出したログのデータに apache.access.log というタグをつけると、
次に、そのタグが記述された match に飛びます。

上記設定の match では、type stdout とし、標準出力に出力するような設定になります。

また、pos_file は、path で指定されたファイルをどこまで読んだかを保持するファイルです。

このファイルを指定することで、fluentdを停止~起動した場合にも、前回からの続きを読み込むことが出来ます。

では、上記の設定を行ったら、起動。

fluentd -c ${HOME}/etc/fluent/fluent.conf -vv

ではデータを流してみましょう。
流すと言っても、kibanaを閲覧すればaccessログが更新されるので、先ほどセットアップしたkibanaを閲覧しましょう。

accessログをtail しておくと比較しやすいのかと思います。

...
119.xxx.xxx.xxx - - [03/Dec/2014:16:03:42 +0900] "GET /kibana/app/panels/timepicker/custom.html HTTP/1.1" 200 3576 "http://183.yyy.yyy.yyy/kibana/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36"

以下がfluentdのログになります。

...
2014-12-03 16:03:42 +0900 apache.access.log: {"host":"119.xxx.xxx.xxx","user":null,"method":"GET","path":"/kibana/app/panels/timepicker/custom.html","code":200,"size":3576,"referer":"http://183.yyy.yyy.yyy/kibana/","agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36"}

上記が確認できたらら、elasticsearchに流し込みます。

構成_6

  • ${HOME}/etc/fluent/fuent.conf
    <source>
      type tail
      path /etc/httpd/logs/access_log
      tag apache.access.log
      pos_file /root/etc/fluent/httpd-access.log.pos
      format apache2
    </source>
    
    <store>
      type copy
      <store>
        type stdout
      </store>
      <store>
        type elasticsearch
        host localhost
        port 9200
      </store>
    </store>
    

設定が完了したら、fluentdを再起動。

再度、kibanaを閲覧します。

kibana_4

kibanaから、elasticsearchにaccessログが投入されていることが見て取れますね?

標準出力への出力は確認の為なので、不要であれば削除してください。

構成_7

  • ${HOME}/etc/fluent/fuent.conf
    <source>
      type tail
      path /etc/httpd/logs/access_log
      tag apache.access.log
      pos_file /root/etc/fluent/httpd-access.log.pos
      format apache2
    </source>
    
    <store>
      type copy
      #<store>
      #  type stdout
      #</store>
      <store>
        type elasticsearch
        host localhost
        port 9200
      </store>
    </store>
    

今回はサクッと設定しただけですので、どのようなデータが見たいか?(アクセス数や、エラー率など)はkibanaの設定を行うことで、更に見やすくなります。

おそらくいじっていく上で、「こういう場合は~?」というような悩みが出てくるのかとは思いますが、
それについては、私のほうでも「ここはこうした!」というTipがあれば展開していければと思います。

根本