Docker環境でのログ確認がめんどくさいのでkibanaでみれるようにしてみた

docker環境で開発を行っていると、いろんなログをコンテナに入って閲覧したりするのがめんどくさいし、見ずらいので、どこか一箇所で見れるようにしたいと思い、docker作ってみました。

一式をGitHubに公開してますので、是非。
https://github.com/yuya-sega/log-viewer/

# 構成
apache 2.4 
postgres 12
fluentd 1.6.2-1.0 
elasticsearch 7.3.2
kibana 7.3.2

# まずは起動してみる
```console
$ git clone https://github.com/yuya-sega/log-viewer.git
$ cd log-viewer/
$ docker-compose build && docker-compose up

~~ 略 ~~
kibana_1         | {"type":"log","@timestamp":"2019-09-20T06:04:14Z","tags":["listening","info"],"pid":6,"message":"Server running at http://0:5601"}
kibana_1         | {"type":"log","@timestamp":"2019-09-20T06:04:14Z","tags":["info","http","server","Kibana"],"pid":6,"message":"http server running"}
kibana_1         | {"type":"log","@timestamp":"2019-09-20T06:04:14Z","tags":["status","plugin:spaces@7.3.2","info"],"pid":6,"state":"green","message":"Status changed from red to green - Ready","prevState":"red","prevMsg":"No Living connections"}
```

ここまで表示されれば起動OKです。
これで、以下のコンテナが起動しました。

```console
$ docker-compose ps
           Name                         Command               State                 Ports               
--------------------------------------------------------------------------------------------------------
log-viewer_apache_1          docker-php-entrypoint apac ...   Up      0.0.0.0:8010->80/tcp              
log-viewer_elasticsearch_1   /usr/local/bin/docker-entr ...   Up      0.0.0.0:9200->9200/tcp, 9300/tcp  
log-viewer_fluentd_1         tini -- /bin/entrypoint.sh ...   Up      0.0.0.0:24224->24224/tcp, 5140/tcp
log-viewer_kibana_1          /usr/local/bin/dumb-init - ...   Up      0.0.0.0:5601->5601/tcp            
log-viewer_postgres_1        docker-entrypoint.sh postg ...   Up      0.0.0.0:5432->5432/tcp  
```

# ログを出力させて、kibanaでみてみる
検証用にhtmlや、データベーステーブルなどを用意していないので、若干無理やり感ありますが
apacheとpostgresのログを出力して、kibanaで見てみたいと思います。

## まずは下準備を。

### apacheのログだす
http://localhost:8010/
上記のURLにアクセスしてみてください。
前述の通り、htmlを用意してないので、403（Forbidden）画面がでてしまいますが、これでapacheのアクセスログがでます。

### postgresのログだす
```console
$ docker-compose exec postgres psql -U postgres -d test
psql (12beta4 (Debian 12~beta4-1.pgdg100+1))
Type "help" for help.

test=# 
```
log-viewerのディレクトリで、上記のコマンドを実行しデータベースに接続を行います。
これでpostgresのログがでます。

### kibanaひらく
http://127.0.0.1:5601
上記のURLにアクセスすると、kibanaのHome画面が表示されます
<img width="1440" alt="スクリーンショット 2019-09-20 15.21.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323088/1c8037b6-fd52-4203-3eec-548a2b534978.png">


## 次にIndex Patternの設定を。
docker起動後、apacheとpostgresのログを出力すると、elasticsearchによってログ収集が開始されます。
収集されたログを閲覧するために以下のような設定を行います。


### Index Pattern設定する画面いく
サードメニューに「Management」アイコンがあるので、それを選択。
<img width="39" alt="スクリーンショット 2019-09-20 15.33.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323088/a6536426-bb11-20e7-0b8a-dc97c93d110a.png"> ←これ
Kibana > Index Patterns を選択します。
表示されている「About Index Patterns」を「×」で消すと「Create Index Pattern」ボタンが出現します。

<img width="1440" alt="スクリーンショット 2019-09-20 15.35.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323088/541d56b6-4ada-8537-e236-fa07b2ff75ef.png">


### apacheログのIndex Pattern設定する
「Index Pattern」に「apache.access-*」と入力して、「Next Step」ボタンを押下する
※「Nest Step」ボタンが押下できない場合は、elasticsearchのログ収集タイミングの問題なので、少し待つ
「Time Filter field name」のプルダウンボックスから「timestamp」を選択し、「Create Index Pattern」ボタンを押下する


### postgresログのIndex Pattern設定する
apacheログのIndex Pattern設定と操作は一緒ですが
「apache.access-* 」と入力したところを「postgres.query-* 」に読み替えて設定してください


## 最後に、設定が終わったので、ログ見てみます。
サードメニューに「Discover」アイコンがあるのでそれを選択。
<img width="36" alt="スクリーンショット 2019-09-20 15.58.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323088/52f1f4f4-1c31-0654-a359-1bb59892bc1a.png"> ←これ

すると、ログが確認できました！

<img width="1439" alt="スクリーンショット 2019-09-20 16.01.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323088/1b10d396-c3f5-3393-d146-22ddf2f2cd0c.png">


# 少し解説
### postgresのログについて。
docker公式のpostgresイメージは、そのままだとログが出力されませんので、下記のパラメータを与えてやることにより、/var/lib/postgresql/data/log にログファイルを出力するように設定しました。

docker-compose.yml#postgres:

```yaml
command: 'postgres -c port="5432" -c log_statement=all -c log_destination=stderr -c log_connections=on -c log_disconnections=on -c logging_collector=on -c log_filename=postgresql.log'
```

### elasticsearchのcluster.routing.allocation.disk.watermark
僕のdockerを起動しているホストマシンは、250GB中220GBが使用中でありディスク使用率85％オーバーでコンテナが起動しない事象が発生しました。。
elasticsearchではどうやらデフォルトでディスク使用率85％以下のマシンでの起動を想定しているようでしたので、その上限値を変更するようにしてます。
同じような境遇にあう人もいらっしゃるかと思い、設定をのこしてます。

docker-compose.yml#elasticsearch

```yaml
- cluster.routing.allocation.disk.watermark.low=95%
- cluster.routing.allocation.disk.watermark.high=95%
```

https://www.elastic.co/guide/en/elasticsearch/reference/current/disk-allocator.html


### elasticsearchとkibanaの関係
elasticsearchとkibanaはバージョンが一緒でないとエラーが発生します。
今回は、docker hubのdocker公式イメージでタグ付けされた最新のバージョンを使用しております。（2019/09/20現在）
https://hub.docker.com/_/elasticsearch
https://hub.docker.com/_/kibana


# 参考
以下の記事を参考にさせていただきました。
https://qiita.com/zgmf_mbfp03/items/0697cc827efa89e5d93e


# さいごに
初記事緊張しました。
今度は、fluentdのconfファイルをもっと調べて汎用的な指定方法ができるようにしてみたいと思います！