Windows環境でFluentd+Elasticsearch+kibanaでアクセスログの可視化

## やりたいこと

Windows7 環境でアプリケーションのアクセスログをKibanaで可視化できるようにしてみたので、メモを書きます。

以下の方にお役に立れば幸いです。
* Spring bootを利用してアプリをできた状態
* サーバはTomcatを利用しています
* アプリの可視化をしていきたい

現時点のソフトのバージョンリスト
* Java 1.8
* Spring Boot 2.1.0
* Tomcat 9
* td-agent 3.2.1
* elasticsearch 6.5.3
* kibana 6.5.3

※ 初めて記事を書きますので、ご不明点、アドバイスがあれば、ぜひコメントしてください！

## アプリ可視化のために、アクセスログ出力の設定

Spring bootからtomcatアクセスログ出力に関して、[fintan](https://fintan.jp/)の記事を参考しました。

[画面やAPIでTomcatのアクセスログを出力する](https://fintan-contents.github.io/spring-crib-notes/latest/html/common/log/web-access-log.html)

logback-access.xmlは以下のように設定しました。

```
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>./log/access.log</file>
       <encoder>
          <pattern>host:%h&#9;timeLog:%t{yyyy/MM/dd HH:mm:ss}&#9;user:%u&#9;method:%m&#9;uri:%U%q&#9;protocol:%H&#9;status:%s&#9;thread:%I</pattern>
       </encoder>
</appender>
```

実際出力されたログ(LTSV形式)：

```
host:127.0.0.1	timeLog:2018/12/16 17:35:07	user:user1@example.com	method:GET	uri:/questions/94	protocol:HTTP/1.1	status:200	thread:http-nio-8080-exec-4
host:127.0.0.1	timeLog:2018/12/16 17:35:07	user:user1@example.com	method:GET	uri:/questions/94	protocol:HTTP/1.1	status:200	thread:http-nio-8080-exec-4
host:127.0.0.1	timeLog:2018/12/16 17:35:07	user:user1@example.com	method:GET	uri:/questions/94	protocol:HTTP/1.1	status:200	thread:http-nio-8080-exec-4
host:127.0.0.1	timeLog:2018/12/15 17:35:07	user:user1@example.com	method:GET	uri:/questions/94	protocol:HTTP/1.1	status:200	thread:http-nio-8080-exec-4
host:127.0.0.1	timeLog:2018/12/15 17:35:07	user:user2@example.com	method:GET	uri:/questions/94	protocol:HTTP/1.1	status:200	thread:http-nio-8080-exec-4
host:127.0.0.1	timeLog:2018/12/15 17:35:07	user:user3@example.com	method:GET	uri:/questions/94	protocol:HTTP/1.1	status:200	thread:http-nio-8080-exec-4
host:127.0.0.1	timeLog:2018/12/15 17:35:07	user:user4@example.com	method:GET	uri:/questions/94	protocol:HTTP/1.1	status:200	thread:http-nio-8080-exec-4
...

```


## 環境構築

### Fluentdのインストール

Fluentdのインストールはホームページからダウンロードします。

[Installing Fluentd using .msi Installer (Windows)](https://docs.fluentd.org/v1.0/articles/install-by-msi)

上記リンクのStep 2まで動作確認ができればOKです。


### Elasticsearchのインストール

Elasticsearchのインストールはホームページから[最新のバージョン](https://www.elastic.co/downloads/elasticsearch#ga-release)をダウンロードします。

Zipファイルを展開します。

```
展開先の参考例　C:\tool\elasticsearch-6.5.3

elasticsearchの起動ファイル　C:\tool\elasticsearch-6.5.3\bin\elasticsearch.bat
```


動作確認

Elasticsearchを起動し、ブラウザで http://localhost:9200 を開くと、Elasticsearchの情報を表示できればOKです。

![120.png](https://qiita-image-store.s3.amazonaws.com/0/154911/a00ea37a-2f8e-229c-14c9-043d855b2ef7.png)



### Kibanaのインストール

KibanaのインストールはElasticsearchと同じホームページから[最新のバージョン](https://www.elastic.co/downloads/kibana)をダウンロードします。

KibanaのバージョンはElasticsearchのバージョンと合わせた方がいいです。
違うバージョンで一部の機能が利用できないの可能性があります。

```
展開先の参考例

C:\tool\kibana-6.5.3
kibanaの起動ファイル C:\tool\kibana-6.5.3\bin\kibana.bat
```

動作確認

Kibanaを起動し、ブラウザで http://localhost:5601 を開くと、GUI 画面が表示できればOKです。

![111.png](https://qiita-image-store.s3.amazonaws.com/0/154911/fbc9cfec-cb8e-5d4c-abd6-23466ff19bbe.png)



### Fluentdの設定

設定はtd-agent.confファイルで行います。

C:\opt\td-agent\etc\td-agentの下にあります。

```
<source>
  @type tail
  path C:\****\log\access.log 　← 読込対象ファイルのパス
  pos_file C:\opt\td-agent\log\access.log.pos  ← 読み込んだポジションの格納先
  tag sample　　 ← 読み込んだ内容にsampleタグを付ける
  format ltsv　　← ログデータの形式に合わせる
</source>

<match sample>　 ← マッチ対象はsampleタグ
  @type elasticsearch　← Elasticsearchに送信するため
  host localhost
  port 9200
</match>
```

### ElasticsearchとKibanaの設定

ElasticsearchとKibanaの設定について、今回はローカル環境で実施するため、デフォルドの設定はいいです。

```
elasticsearch-6.5.3\config\elasticsearch.yml  ← elasticsearchの設定ファイル

kibana-6.5.3\config\kibana.yml  ← kibanaの設定ファイル
```


## 可視化

環境構築をした上、作ったアプリにアクセスすると、Elasticsearchにデータが入るようになるので、Kibanaの「Management」→「Index Patterns」→「Create index pattern」で「fluentd」のインデックスを選択して、
「Configure settings」を「timelog」に設定して、「Create index pattern」を押下します。

それで、「fluentd」というインデックスがKibanaのDiscoveryで見えます。

ログデータのグラフ化はKibanaのvisualzeで設定しますが、今回は省略します。


![111.jpg](https://qiita-image-store.s3.amazonaws.com/0/154911/f344cb26-2722-7152-4057-d69aad2e5b96.jpeg)

![112.jpg](https://qiita-image-store.s3.amazonaws.com/0/154911/86873264-e08c-8190-d950-82821664988c.jpeg)

![113.jpg](https://qiita-image-store.s3.amazonaws.com/0/154911/c314bd73-2551-80fa-7f36-6c55f13f3e4b.jpeg)


## 豆知識

 Elasticsearchはインデックスに登録するデータのうち、日付としてフォーマットされているフィールドを自動で`date`型にマッピングします。詳細は[ここ](https://www.elastic.co/guide/en/elasticsearch/reference/current/date.html)に参照してください。

上記で出力されたアクセスログの「timeLog」の項目について、 Elasticsearchが日付として、自動認識してくれてます。

また、今回の実施環境では、以下のように各プロダクト、データのTimezoneがずれた状態で実施してしまったため、Kibanaでうまく表示できない問題が発生しました

* インデックスに登録したデータ → JST
* Elasticsearch → UTC
* KibanaのTimezone →　JST

この状態でデータを登録し、Kibanaで表示すると、アクセスログの時間が日本時間とは異なる時刻で表示されてしまいました。

解決方法：
Kibanaの「Timezone for date formatting」設定を変更します。

変更場所：「Management」→「Advanced Settings」→「Timezone for date formatting」
変更内容：デフォルトの「browser」→「Etc/UTC」に変更

## 参照

[Apacheのアクセスログを、FluentdでtailしてElasticsearchに放り込む](https://qiita.com/charon/items/86d12ac7ca2d7cf6c580)