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
まずは起動してみる
$ 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です。
これで、以下のコンテナが起動しました。
$ 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のログだす
$ 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画面が表示されます
次にIndex Patternの設定を。
docker起動後、apacheとpostgresのログを出力すると、elasticsearchによってログ収集が開始されます。
収集されたログを閲覧するために以下のような設定を行います。
Index Pattern設定する画面いく
サードメニューに「Management」アイコンがあるので、それを選択。
←これ
Kibana > Index Patterns を選択します。
表示されている「About Index Patterns」を「×」で消すと「Create Index Pattern」ボタンが出現します。
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」アイコンがあるのでそれを選択。
←これ
すると、ログが確認できました!
少し解説
postgresのログについて。
docker公式のpostgresイメージは、そのままだとログが出力されませんので、下記のパラメータを与えてやることにより、/var/lib/postgresql/data/log にログファイルを出力するように設定しました。
docker-compose.yml#postgres:
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
- cluster.routing.allocation.disk.watermark.low=95%
- cluster.routing.allocation.disk.watermark.high=95%
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ファイルをもっと調べて汎用的な指定方法ができるようにしてみたいと思います!