Elasticserchとkibanaでログの可視化

このエントリーは、エキサイト Advent Calendar 2016 の 12/14 の記事です。

エキサイトとしては初のAdvent Calendar参戦です。

スノーボードに行きたくてうずうずしている

エキサイトのブログチーム エンジニアの山野です。


エキサイトブログ では 11月よりアクセスレポートのリニューアルを行いました。


今回はアクセスレポートに関連してログの可視化について記載していきたいと思います。


WEBエンジニア大募集!

エキサイトではWEBエンジニアを中途採用で募集しています。
☆キャリアチェンジも大歓迎☆
充実した研修制度で成長したい方、ぜひこちらからご応募ください。


はじめに

なんのためにfluentdからelasticserchに流し込むの??

elasticsearch社が提供しているkibanaを使ってログの可視化(グラフ化)が

ニアリアルタイムで確認することができます。

すると日々溜まっていたログから何かしらの情報(不正アクセス等)を確認したい時。

今まで、わざわざサーバーに入ってログを開いて確認していためんどくさい作業が

fluentd -> elasticsearch <-> kibana 構成でログをelasticsearchのqueryで検索できたりグラフ化することができます。

グラフ化することで負荷の高い時間帯や不正なアクセス等が一目瞭然でわかります。

結果めんどくさい作業や時間を短縮できたりもするのではないでしょうか。

リアルタイムなランキング等も簡単に出せたりもします。


他にもこんなメリットがあります!ということがありましたらSNSでシェアしていただけますと助かります。


それでは簡単に手順について書いていきます。


環境

  • Ubuntu 14.04
  • openjdk-8-jdk
  • fluentd 0.12.26
  • elasticserch 2.3.5
  • Kibana 4.5.4

Elasticserchとkibanaでログの可視化_f0364156_13054779.png

fluentdとはTreasure Dataが開発しているオープンソースのソフトウェア
複数のサーバーに散らばっているログを集約できる便利なソフトウェアです。
それではまず、fluentdの設定について

集約サーバへ転送するためのfluentdの設定(送信側)
// elasticsearch plugin install
$ sudo /opt/td-agent/embedded/bin/gem install fluent-plugin-elasticsearch
// アクセスログをelasticsearchに流す
<source>
type tail
format /^(\tD=(?<accesstime>[\d]+))(\tI=(?<ip>[0-9.]+))?(\tU=(?<uid>[^\t]+))?(\tM=(?<method>[^\t]+))?(\tG=(?<ua>[^\t]+))?(\tR=(?<request_path>[^\t]+))?(\tF=(?<referer>[^\t]+))?(\tQ=(?<query>[^\t]+))?(\tSN=(?<SN>[^\t]+))?(\tSLC=(?<SLC>[^\t]+))?(\tSO=(?<SO>[^\t]+))?(\tx_domain=(?<x_doman>[^\t]+))?(\tRESPONSE_T=(?<RESPONSE_T>[^\t]+))?(\tSTS=(?<STS>[^\t]+))?.*$/
format apache2
// アクセスログをelasticsearchに流す
time_format %y%m%d%H%M%S
path /var/log/apache2/fewslog.%Y%m%d
read_from_head true
pos_file /tmp/td_agent_fewslog_elasticsearch.pos
tag excite.fewslog.elasticsearch.log
</source>

// matchしたログ転送設定
<match **>
type forward
<server>
host 192.168.*.*
</server>
</match>

parameters
formattailするログのフォーマットを指定します。正規表現での指定も可能です。今回は社内で利用しているログが独自フォーマットの為、正規表現で指定しています。apacheのaccesslogの場合はformat apache2と指定するだけで大丈夫です。
time_format時刻書式を指定します。
pathtailするログのpathを指定します。","で複数のpathを指定することもできます。
read_from_headtail pluginはデフォルトでは末尾に追加された際に動作するがファイルを頭から読みたい場合trueにする。今回は日付が変わって新しいファイルに切り替わった瞬間のログを欠損させないためにtrueにしています。
pos_filetailをどこまでしたか記録するファイルの指定をします。
tagイベントのタグです。

tail plugin 詳しい内容はこちら
logformat正規表現のチェックに便利です。

elsssticserchへ転送するためのfluentdの設定(受信側)
<match excite.fewslog.elasticsearch.**>
type elasticsearch
host 192.168.*.*
port 9200
type_name fews_log
logstash_format true
buffer_type file
buffer_path /tmp/logs/fews/fluentd*.buffer
buffer_chunk_limit 256m
buffer_queue_limit 128
flush_interval 60s
retry_wait 5s
</match>

parameters
hostelasticsearchのhostを指定します。
portelasticsearchのportを指定します。
type_nametype_nameを指定します。テーブル名みたいなもの。
logstash_formatlogstashformatで出力します。
buffer_typebufferを出力するタイプ
buffer_pathbufferのpathを指定します。
buffer_chunk_limit設定した容量がたまったらファイルに出力します。elasticserch側の設定 http.max_content_lengthより大きいとエラーになるので注意。
buffer_queue_limit未送信のbuffer_chunkの保持数を指定します。
flush_intervalbuffer_chunk_limitに設定した容量に達しなくても指定した時間を経過したらファイル出力されます。
retry_wait再送するまでの時間を指定します。

Elasticserchとkibanaでログの可視化_f0364156_13060285.png


elasticsearchとはオープンソースの全文検索エンジンです。
RDBと全文検索エンジンの大きな違いは
RDBは条件に一致したデータを返すのに対して
全文検索エンジンは大量のドキュメントの中から
条件に関連したデータを返してくれます。
elasticsearchはREST(json形式)の入出力となっています。
GitHubやFacebook等でも導入されていて
全文検索エンジンの中で現時点では1番人気とのことです。
elasticsearchについてわかりやすくまとめてありました。

続いてelasticsearchの設定をしていきます。

installしたelasticserchのpluginの一覧
  • kuromoji
  • kopf
  • kibana
  • analysis-icu

elasticsearch install
// plugin install
$ cd /usr/share/elasticsearch/
$ sudo wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/plugin/analysis-kuromoji/2.3.5/analysis-kuromoji-2.3.5.zip
$ sudo bin/plugin install file:///usr/share/elasticsearch/analysis-kuromoji-2.3.5.zip
$ sudo wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/plugin/analysis-icu/2.3.5/analysis-icu-2.3.5.zip
$ sudo bin/plugin install file:///usr/share/elasticsearch/analysis-icu-2.3.5.zip
$ sudo wget https://github.com/lmenezes/elasticsearch-kopf/archive/master.zip
$ sudo bin/plugin install file:///usr/share/elasticsearch/master.zip
$ sudo wget http://download.elasticsearch.org/kibana/kibana/kibana-latest.zip
$ sudo bin/plugin install file:///usr/share/elasticsearch/kibana-latest.zip

// 再起動して設定反映
$ sudo service elasticsearch restart

// kopfをブラウザで確認
// http://192.168.*.*:9200/_plugin/kopf/

// elasticsearch.ymlに設定を追加
$ sudo vi /etc/elasticsearch/elasticsearch.yml
http.max_content_length: 1024mb
http.max_initial_line_length: 100k
threadpool.index.queue_size: -1
threadpool.bulk.queue_size: -1
bootstrap.mlockall: true

parameters
http.max_content_lengthpostする際のcontentlengthがここで設定した容量を超えるとエラーになります。デフォルトは100mb
http.max_initial_line_lengthurlのmaxlengthの設定。デフォルトは4kb
threadpool.index.queue_sizeindex/deleteでペンディングされたリクエストのキューの数の設定。デフォルトは200 無制限の場合は -1
threadpool.bulk.queue_sizebulkでペンディングされたリクエストのキューの数の設定。デフォルトは50 無制限の場合は -1
bootstrap.mlockallスワップしないようにtrueを設定します。

詳しくはこちら
test環境のログから大量のログを流し込むように切り替えたところメモリ足りなく警告が出始めた。

[WARN ][monitor.jvm              ] [Revanche] [gc][old][6025][64] duration [29.4s], collections [1]/[29.8s], total [29.4s]/[19.2m], memory [24.5gb]->[11gb]/[24.9gb], all_pools {[young] [47.4mb]->[2kb]/[266.2mb]}{[survivor] [28.3mb]->[0b]/[33.2mb]}{[old] [24.5gb]->[11gb]/[24.6gb]}

物理メモリを増やしてheapsizeをあげる対応をしました。公式によるとelasticserchに割り振る物理メモリーの目安は半分程度がいいらしいです。32GBは超えてはいけないとのことです。

$ sudo vi /etc/init.d/elasticsearch
ES_HEAP_SIZE=7g

kopf

今回インストールしたkopfについて
elasticsearchのクラスタ管理プラグインです。
リソースの状態やindexの管理ができる便利なpluginです。

Elasticserchとkibanaでログの可視化_f0364156_19020881.png

Elasticserchとkibanaでログの可視化_f0364156_19023272.png


kibanaとはelasticsearchで使用できる可視化ツール
ニアリアルタイムでログを確認できます。
Elasticserchとkibanaでログの可視化_f0364156_15364056.jpg

ということで最後にkibanaのinstallです。

kibana install
$ wget https://download.elastic.co/kibana/kibana/kibana-4.5.4-linux-x64.tar.gz
$ cd /usr/local/
$ /usr/local$ sudo mv ~/kibana-4.5.4-linux-x64.tar.gz ./
$ sudo tar zxvf kibana-4.5.4-linux-x64.tar.gz
$ sudo ln -s kibana-4.5.4-linux-x64 kibana
$ cd kibana/
$ sudo cp -p config/kibana.yml config/kibana.yml.org
$ sudo vi config/kibana.yml
elasticsearch.url: "http://192.168.*.*:9200"

// kibanaをdaemonで起動するためのスクリプト
$ cd ~
$ git clone https://github.com/pbamba/kibana-beta-daemon.git
$ sudo cp kibana-beta-daemon/kibana /etc/init.d/
$ sudo chmod 755 /etc/init.d/kibana
$ sudo vi etc/init.d/kibana
//17行目空になっているので起動スクリプトの場所を指定
DAEMON=/usr/local/kibana/bin/kibana

// kibana起動
$ sudo service kibana start

// ブラウザで確認
// http://192.168.*.*:5601

daemonで起動してなかったのでセッションが切れるたびにわざわざ起動してたんですが
githubに起動スクリプトが上がっておりました。

useragent, referer等長い文字列の場合はvisualizeすると要素解析されてしまうので
要素解析して欲しくない場合はdynamic_templatesでanalyzersの設定が必要になります。
Elasticserchとkibanaでログの可視化_f0364156_18513426.png

useragentが要素解析されてしまうとこのような残念な状態に…

感想

リアルタイムにログを確認できるので怪しいアクセス等をすぐに見つけることができたり、
サービスを運用するのに良さそうだと思いました。
今回は単純にログをelasticsearchに入れただけなので
ログを集計してエキサイトブログのユーザーの方にリアルタイムでアクセスレポートを提供できたら喜んでもらえるのではないかと感じました。

明日は、エキサイトビアバッシュでDJとして大活躍した同じくブログ担当エンジニアTさんのお話です。
お楽しみに。

クリスマスまで続くエキサイト Advent Calendar 2016
ぜひ今後も投稿をウォッチしてください!


エンジニア募集

エキサイトではエンジニアとして一緒に働いてくださる方を
新卒採用中途採用で募集しています。
詳しくは、こちらの採用情報ページをご覧ください。


by ex-engineer | 2016-12-14 00:00