CentOS7環境でFluentd+Elasticsearch+Kibana4を構築する(後編)

[前編](http://qiita.com/kenichi_nakamura/items/adf7fe27ac4257d4c37a)から大分時間があいてしまいましたが、
後編はいよいよアクセスログをElasticsearchに突っ込んで、Kibana4でアクセス状況をグラフで見る！
というところをやってみようと思います。

今回の主な流れは
・Apache2のアクセスログをtd-agentで拾ってElasticsearchに突っ込む
・Kibana4で初期設定を行い、Elasticsearchに入っているアクセスログデータを見てみる
です。
※これだけ見ると簡単そうですが、結果的にえらい長文になってしまいました。。

また、Apache2は既にインストール済みであることを想定しています。
必要に応じてインストールしてください。
※Nginxをお使いの場合は、ApacheをそのままNginxに置き換えればほぼいけるのではないかな、と思います。

# 1. Apacheのアクセスログを拾ってElasticsearchに突っ込む

ようやくtd-agentの出番です。td-agentの設定ファイル"td-agent.conf"を編集することで実現します。

## 1.1. td-agent.confを編集する

エディタで開きましょう

```text:192.168.33.10(ゲストOS)
$ sudo vi /etc/td-agent/td-agent.conf
```

そして設定を追加していきます。

### 1.1.1. Apacheアクセスログを入力する設定

まずは、Apacheのアクセスログを拾う部分です。

```text:td-agent.conf
<source>
  type tail
  path /var/log/httpd/access_log
  format apache2
  pos_file /var/log/td-agent/httpd.access.log.pos
  tag apache2.access
</source>
```

td-agent.confの[記述ルール](http://docs.fluentd.org/articles)についての詳細は割愛させて頂き、ざっくりとした説明ですが、
まず`<source>～</source>`の部分はsourceディレクティブといって、
入力元に関する設定をする部分です。
このsourceディレクティブの中に、Apacheのログはどこにある、だとかの設定を書いていきます。

sourceディレクティブの中身については以下の通りです。
※この設定は`type`の設定(プラグイン)によって異なります。

|   Key  |            Sample Value              |                                        Remarks                                            |
|:-------|:-------------------------------------|:------------------------------------------------------------------------------------------|
|  type  |                 tail                 |                         入力(プラグイン)のタイプを指定します                            |
|  path  |       /var/log/httpd/access_log      |                         入力するログファイルのパスを指定します                              |
| format |                apache2               |                            入力ログのフォーマットを指定します                                |
|pos_file|/var/log/td-agent/httpd.access.log.pos|                     読み込み位置を覚えておく為のpos_fileのパスを指定します                    |
|   tag  |             apache2.access           |この入力イベントのタグ名を指定します。タグはtd-agentにおいて、イベントのルーティングに使用されます。|

`type tail`

の部分はこのsourceディレクティブの入力(プラグイン)タイプの設定しています。

今回は"tail"と設定してあり、これはlinuxコマンドの```tail -f```と同じように
アクセスログファイルの末尾に追加されたログを読み取っていくという入力方法であることを意味しています。([tailプラグイン](http://docs.fluentd.org/articles/in_tail))
他には"http"や"forward"といったものも設定でき、これらは総じて"input プラグイン"と言われます。

`path /var/log/httpd/access_log`

の部分は、今回Kibana4で可視化したいApacheのアクセスログのパスを設定しています。

`format apache2`

アクセスログのフォーマットをプリセットされたフォーマットタイプ、もしくは正規表現で設定します。
今回はApache2のログが対象なので`apache2`というフォーマットタイプを指定しています。
フォーマットタイプには`"apache_error/nginx/syslog/tsv/csv/ltsv/json"`といったようなものが指定できますが、
アクセスログの出力をカスタマイズしている場合には、フォーマットタイプではパースできないことに注意しましょう。
その場合は正規表現で記述しますが、所謂「名前付きキャプチャ」形式で記載する必要があります。
例えば、以下のように記述できます。

```
^(?<host>[^ ]+) [^ ]+ [^ ]+ \[(?<time>[^\]]+)\] "(?<request>[^ ]+ [^ ]+ [^ ]+)" (?<code>[^ ]+) .+ ".+" "(?<ua>.+)" (?<latency>[^ ]+)$
```

この場合、それぞれの名前の部分がElasticsearchに入る際のキー名になります。

`pos_file /var/log/td-agent/httpd.access.log.pos`

tailプラグインは追記されたものをどんどん拾うプラグインです。
その為、入力ファイルのどの位置まで読み込んだかを記憶しておく必要がありますが、
そのためのposファイルの場所を指定します。

`tag apache2.access`

この入力イベントのタグ名を設定します。このイベントが完了した後、次のイベントに行くわけですが
そのルーティングの為に使用します。
この辺の話は、次のElasticsearchへの出力設定の際に少し触れます。

### 1.1.2. Elasticsearchへログを出力する(書き込む)設定

次に入力されたApacheログをElasticsearchに出力する設定を追加します。

```text:td-agent.conf
<match apache2.access>
  type elasticsearch
  host localhost
  port 9200
  type_name apache_access
  logstash_format true
</match>
```

今度は`<match>～</match>`で囲まれています。
これはmatchディレクティブといって、タグ名を指定します。
そして、このタグ名がマッチした際にそのイベントを実行するというものです。

さて、入力側の設定ではsourceディレクティブ内の`tag`に`apache2.access`と設定しました。
sourceディレクティブのイベントによってApacheのアクセスログが```tail -f```形式で
入力されてくると`apache2.access`というタグ名がつけられて、次の処理に進みます。
そして`<match>`ディレクティブで`<match apache2.access>`とすることで
`apache2.access`というタグついているものは、ここにマッチするというわけです。

つまりこの```<match>```ディレクティブ内にElasticsearchに書き込むよ！という処理を記述しておけば良さそうですね！

それでは```<match>```ディレクティブの内容を見てみます。

|           Key         | Sample Value  |                                                  Remarks                                                    |
|:----------------------|:--------------|:------------------------------------------------------------------------------------------------------------|
|          type         | elasticsearch |                         出力(プラグイン)のタイプを指定します。                                                 |
|          host         |   localhost   |                         Elasticsearchのホスト名を指定します。                                                 |
|          port         |      9200     |                         Elasticsearchのport番号を指定します。                                                 |
|       type_name       | apache_access |                      Elasticsearchに投入する際のタイプ名を指定します。                                         |
|    logstash_format    |      true     |                 Logstash形式で扱うかどうかを設定します。ここは基本的にtrueにしておきましょう。                    |

```type Elasticsearch```

このディレクティブではElasticsearchにデータを出力(書き込む)したいので、[elasticsearchプラグイン](https://github.com/uken/fluent-plugin-elasticsearch)を指定します。

`host localhost`

出力先のElasticsearchのホストを指定します。今回はtd-agentとElasticsearchは同じホストにあるので`localhost`としていますが
別立てしている場合はそのホストを指定してやれば良いです。
`host`でなく`hosts`パラメータを使えば、複数のElasticsearchを指定することもできます。

`port 9200`

Elasticsearchのport番号を指定します。デフォルトであれば9200ですが、変更している場合はその番号を指定しましょう。

`type_name`

投入する際のElasticsearchのタイプ名を指定します。ElasticsearchにおけるタイプとはRDBでいうテーブルに相当します。

`logstash_format`

Logstashの形式で扱うかどうかを設定します。Logstash形式で扱うようにしたほうが色々と便利なので、基本的にはtrueで良いと思います。
これがtrueだと、投入先のElasticsearchのインデックス名が`logstash-YYYY.mm.dd`となり、
Elasticsearchの投入される際に`@timestamp`として時刻パラメータが追加されます。

ちなみにElasticsearchにおけるインデックスとはRDBのDBに相当します。

## 1.2. td-agentを再起動して設定を反映させる

長かった・・・
色々と設定を変更したので、サービスを再起動します。

```text:192.168.33.10(ゲストOS)
$ sudo service td-agent restart
```

これでApacheのアクセスログに記録されたものがElasticsearchにどんどん突っ込まれるようになりました！

一応確認してみましょう。
Elasticsearchのインデックス名を見てみます。上手く投入されていれば、`logstash-YYYY.mm.dd`でインデックス名が出来ているはず！

```text:192.168.33.10(ゲストOS)
[vagrant@localhost ~]$ curl -XGET localhost:9200/_alias?pretty
{
  ".kibana" : {
    "aliases" : { }
  },
  "logstash-2015.09.13" : {    // ★
    "aliases" : { }
  }
}
[vagrant@localhost ~]$
```

できていました！ちなみに`.kibana`というインデックスはKibanaの設定情報が記録されますが、まずは気にしなくてOKです。

```text:Tips
ここで上手く入っていないという場合は、td-agentのログを見てみましょう。
$ /var/log/td-agent/td-agent.log

ひっかりやすい項目としては、
・td-agentにはApacheログを参照する権限がなくて開けない⇒パーミッションを変更する等しましょう
・単純にログがない⇒アクセスしましょう！
・どこかの設定が間違っている⇒td-agent.confを見直しましょう
```

# 2. Kibana4で見てみる

ようやく下準備が完了しました。ElasticsearchにはApacheのログが流れている状態になっており、
どんどんデータが貯まっていることと思います。

ではその様子をKibana4で見てみましょう。

## 2.1. Kibana4にアクセスし初期設定をする

[前編](http://qiita.com/kenichi_nakamura/items/adf7fe27ac4257d4c37a)の最後でアクセスまでは経験済みです。

```text:ブラウザ(ホストOS)
http://192.168.33.10:5601/
```

![top_exists_index.png](https://qiita-image-store.s3.amazonaws.com/0/53473/589e667b-f21a-8bf2-5ed9-38ebe62bf4a0.png)


今回はElasticsearchにインデックスが出来ているので、前回みたものとは少し様子が違います。
前回はインデックスがなかったので`Unable to fetch mapping...`のようなメッセージが表示されていましたが、
今回は`Time-field name`という部分が赤い枠で囲まれています。

クリックしてみると`@timestamp`が選択できますので、今回はそのままそれを選択します。

![top_exists_index_002.png](https://qiita-image-store.s3.amazonaws.com/0/53473/979843ba-93b7-5e19-3010-0532d3502d20.png)


少しまとめると、この画面はKibana4の初期設定画面で
* 可視化対象のElasticsearchのインデックスの設定
* 時間の基準となるパラメータの設定
をしています。

最後に`Create`を押下すると、初期設定は完了です。

## 2.2. アクセスの状況を見てみる

では早速アクセスログの状況を見てみましょう。
`Discover`を選択してみます。

![kibana_menu.png](https://qiita-image-store.s3.amazonaws.com/0/53473/09959abf-fe52-8370-edcd-834ea0358ee1.png)

こんな感じで、時系列にアクセスログの状態を見ることができます。
※とはいえ、私は一時的にちょろっとしたアクセスしかしなかったので、寂しい限りですが・・・

![kibana_discover_001.png](https://qiita-image-store.s3.amazonaws.com/0/53473/c7e48fd5-8851-654b-208b-452262e2a3b1.png)

Kibana4の画面右上の"Last 15 minutes"をクリックしてみましょう。
表示するアクセスログの対象期間を変更することができます。
※↑のサンプル画像では"Last 24 hours"となっています。

これを見ると17:00頃に100件程のアクセスがあったんだなあ、とわかるわけです。
※緑のバー部分をマウスオーバーすると詳細な件数がポップアップで表示されます。

```text:Tips
あれ？Elasticsearchにデータあるはずなのに、"No results found"と表示される・・・
という方は、Kibana4で表示する「期間設定」が短い可能性があります。

Kibana4の画面の右上に"Last 15 minutes"という表示があると思いますが、デフォルトでは直近15分の
ログしか対象になりません。この場合、直近15分のアクセスログがないと、表示できるものが何もないので
"No results found..."となるわけです。

では、期間を変更すれば良いわけですが、"Last 15 minutes"と表示されている部分をクリックしてみましょう。
期間を変更することができます。
```

画面左部分にはアクセスログのフィールド名が表示されています。
試しにいくつかフィールドをクリックしてみてください。
各フィールドのカウントランキングが表示されます。

![kibana_discover_003a.png](https://qiita-image-store.s3.amazonaws.com/0/53473/cf19a0ca-47b1-fe25-c630-120b042fd5fb.png)


画面中央部には直近のログの内容が表示されています。

![top_exists_index_004.png](https://qiita-image-store.s3.amazonaws.com/0/53473/02fc07eb-ee91-0428-627c-65ede1f1693e.png)

以上が`Discover`ページになります。
さらっとサマリーを見たい場合に便利です。

## 2.2. グラフを作ってみる

今度は`Visualize`をクリックします。
`Visualize`ではグラフをはじめ、様々なタイプで視覚化をすることができます。

![kibana_menu_002.png](https://qiita-image-store.s3.amazonaws.com/0/53473/85ddd53d-4abd-77cd-0d00-eafcf6d33c0f.png)

まず、視覚化のタイプ一覧が表示されます。

### 2.2.1. 視覚化のタイプを選択する

今回は全アクセスのステータスコードの割合を視覚化してみたいと思います。
`Pie chart`を選択しましょう。

![visualize_001.png](https://qiita-image-store.s3.amazonaws.com/0/53473/5c45283d-8f7d-8435-105d-fd36961f766c.png)

### 2.2.2. search sourceを選択する

今回は新規の`From a new search`を選択します。

### 2.2.2. 視覚化の設定をする

今回の場合だと、何をPie chartで表したいのかを設定します。
まず`Split Slices`を選択します。

![pie_chart_001.png](https://qiita-image-store.s3.amazonaws.com/0/53473/ad4c7eb2-8a16-1d0f-5825-c7407518dbcc.png)

`Aggregation`には`Terms`を選択します。

![pie_chart_002.png](https://qiita-image-store.s3.amazonaws.com/0/53473/9bcf7c3b-4e34-dc6f-efe0-41dcd98f9ad3.png)

`Field`に`code`を選択し`Apply`を押下します。

![pie_chart_003.png](https://qiita-image-store.s3.amazonaws.com/0/53473/680dcad2-f8e9-79a0-65b8-1cf0dbc8a680.png)

これでステータスコードの割合を表す`Pie chart`ができました！

![pie_chart_004.png](https://qiita-image-store.s3.amazonaws.com/0/53473/8d15fe6d-8147-0060-436f-35d72660ccc2.png)

### 2.2.3. 保存する

さて、折角作ったので保存しておきましょう。
`Pie chart`の右上あたりのメニューから、保存ボタンを選択し、適当な名前をつけて保存します。

![pie_chart_005.png](https://qiita-image-store.s3.amazonaws.com/0/53473/bdef7b1d-00fb-2077-5a7f-718383482e33.png)

とりあえず`status-pie`として保存しました。

![pie_chart_006.png](https://qiita-image-store.s3.amazonaws.com/0/53473/7dad8cb8-5ede-02f1-bd72-e7b17df00ebf.png)

## 2.3. Dashboardを作ってみる

Dashboardとは作成したグラフ等を一覧で見ることのできるものです。
先ほど作成したステータスコードの`Pie chart`や、アクセスカウントの折れ線グラフ等を
一緒に表示しておけば、サービスの運用監視に便利ですね！

では`Dashboard`を選択します。

![kibana_menu_003.png](https://qiita-image-store.s3.amazonaws.com/0/53473/e5342da1-e720-ce88-9fc6-98d9d53d7bed.png)

Dashboard上にはまだ何もないので、こんな表示になっています。

![dashboard_001.png](https://qiita-image-store.s3.amazonaws.com/0/53473/7160d758-1314-e900-f744-63178b1e6626.png)

それでは先ほど作成した`Pie chart`を追加してみましょう。
以下の画像のように`+`ボタンを押下して

![dashborad_002.png](https://qiita-image-store.s3.amazonaws.com/0/53473/a0fed59f-8505-61a7-08d6-cc4a1dfd8e4d.png)

`status-pie`を選択します。

![dashborad_003.png](https://qiita-image-store.s3.amazonaws.com/0/53473/b14bc3f7-2c23-5ff3-d5c4-8d9c80b6cb41.png)

すると、Dashborad上に先ほど作成した`Pie chart`が表示されました！

![dashborad_004.png](https://qiita-image-store.s3.amazonaws.com/0/53473/70f85b0e-ce9c-e51a-0977-250c58fe5f34.png)

このように見たい情報をどんどん視覚化してDashboardに追加していくことで
必要な情報をひとめで確認することができますね！

以上で後編はおしまいです。
Elasticsearchにデータを突っ込んで、Kibana4で視覚化してみるところまでやってみました。

次回はもっと詳細なKibana4の視覚化の方法や、Elasticsearchのノウハウなどをまとめる予定です！