タグ別アーカイブ: logstash

10分でELKスタックを構築してみる

タグ: , , | 投稿日: 投稿者:

満員電車の時はとなりにハイヒール女子がいない事を確認しておきましょう。電車が揺れた時に痛い目をみます。

ベッチです。

今回はログ収集・解析・可視化についてです。

もはやデファクトとなったELKスタックをローカルマシン(ただしこの記事での説明はMacに限ります)に10分で構築します(コマンドは数回実行するだけです)。

ELKスタックとはElasticsearch社のElasticsearch(解析) + Logstash(収集) + Kibana(可視化)の3つの製品の総称です。 

順番的にはLEKの方がしっくりくると思うのは自分だけでしょうか。

ちなみにLogstashのかわりにfluentdを使うパターンがEFKスタックと呼ばれるものです。

それでは早速構築していきます。

もちろん10分で構築するのですからアレを使う前提です。 そうですコレです。

  • Boot2Docker
  • docker-compose

コレの環境は今の時代当然インストール済みであると思っているので特に説明しません。

ソースはGithubにあがっている以下を利用します。

https://github.com/deviantony/fig-elk

上記ソースを利用して構築されるELKのバージョンは現時点でそれぞれ以下の通りです。

  • elasticsearch 1.5.0
  • logstash 1.4.0
  • kibana 4

1.fig-elkをクローンする

git clone git@github.com:deviantony/fig-elk.git
cd fig-elk

2.logstash.confにfilterを追加

これ追加しとくとApacheのログ収集する時にいろいろと分析しやすくなります。

# 修正対象ファイル logstash-conf/logstash.conf

input {
    tcp {
        port => 5000
    }   
}

# Add your filters here
filter {
    grok {
        match => { "message" => "%{COMBINEDAPACHELOG}" }
        break_on_match => false
        tag_on_failure => ["_message_parse_failure"]
    }   
    date {
        match => ["timestamp", "dd/MMM/YYYY:HH:mm:ss Z"] 
        locale => en
    }   
    geoip {
        source => ["clientip"]
    }   
    grok {
        match => { "request" => "^/%{WORD:first_path}/%{GREEDYDATA}$" }
        tag_on_failure => ["_request_parse_failure"]
    }   
    useragent {
        source => "agent"
        target => "useragent"
    }   
}

# Must use http protocol and specify the host to use Kibana4
output {
    elasticsearch { 
        protocol => "http"
        host => "elasticsearch"
    }   
}

3.docker-compose upする

最後に以下を実行すればELKのそれぞれのコンテナが起動し始めます。(※初回のみコンテナイメージのダウンロードで時間かかります。10分で構築するという部分の9割がここに時間使います)

docker-compose up

kibanaが起動してきたら完了です。念のためコンテナのプロセスを確認しておきます。(折り返しちゃってみずらいですが)

$ docker ps
CONTAINER ID        IMAGE                                 COMMAND                CREATED             STATUS              PORTS                           NAMES
f42553439266        deviantony/elk-logstash:latest        "/opt/logstash/bin/l   About an hour ago   Up About an hour    0.0.0.0:5000->5000/tcp          figelk_logstash_1        
d5697254c482        deviantony/elk-kibana:kibana3         "nginx -g 'daemon of   About an hour ago   Up About an hour    443/tcp, 0.0.0.0:8080->80/tcp   figelk_kibana3_1         
0f9a20c87f6e        deviantony/elk-kibana:latest          "/entrypoint.sh"       About an hour ago   Up About an hour    0.0.0.0:5601->5601/tcp          figelk_kibana4_1         
810736bac50d        deviantony/elk-elasticsearch:latest   "/usr/share/elastics   About an hour ago   Up About an hour    0.0.0.0:9200->9200/tcp          figelk_elasticsearch_1   

これで環境構築は完了です。

それでは実際に動きを確認してみます。

以降にでてくるboot2docker-ip-addressという部分はboot2dockerのIPに便宜変更して下さい。

以下で確認できます。

boot2docker ip

4.ローカルマシン上でApacheのログファイルをLogstashへ送る

サンプルとしてなんでも良いので適当にApacheのログファイルをLogstashへ読み込ませてみます。

以下を実行するだけです。(※access.logのファイルパスは便宜変更して下さい)

nc boot2docker-ip-address 5000 < access.log

5.Elasticsearchにインデックス化されているかを確認する

確認する前にelasticsearchに「elasticsearch-head」というプラグインをインストールしておきます。

インストールしておくと実際にデータがelasticsearchにインデックスされているかどうかの確認ができるWebインタフェースが利用できます。

docker exec -it b483227414d0 bash
cd /usr/share/elasticsearch
./bin/plugin install mobz/elasticsearch-head

ブラウザで以下へアクセスする。

http://boot2docker-ip-address:9200/_plugin/head/

以下のような画面が表示されてインデックス状態がわかります。 

elasticsearch-head

ちなみに「Bison」って書かれているのがnode名です。 指定しないと自動的にMARVELヒーローの誰かの名前になります。

今回はBisonってなってます。知りません。

6.お待たせしました、最後にKibanaで確認します

ブラウザで以下にアクセスします。

http://boot2docker-ip-address:5601

すると最初は以下の画面が表示されます。

Settings_-_Kibana_4

「Time-field name」を@timestampにして「Create」ボタンをクリックして下さい。

すぐさまSettings画面に遷移しますが、Discover画面に遷移して下さい。

すると単純な棒グラフが表示されると思います。

Discover_-_Kibana_4_と_iOS_Certificates_-_Apple_Developer

表示されない場合は画面右上のTimeFilterを今回インデックスしたログファイルのタイムスタンプの範囲にすると表示されるはずです。

これでいろいろ触りながら確かめる環境ができました。

実際にはこのVisualizeの画面で可視化したいデータを選んでグラフつくって保存してっていうのを繰り返してDashboardでみるという流れになるので好き勝手にいろいろいじり倒してみて下さい。

それでは。