Dockerのログ収集方法の調査

# すべてのログは標準出力・標準エラー出力に出力

・Dockerのlogging driver
　・ログの集約がしづらい
　・Fluentdに転送設定
　　コンテナ起動時に既にFluentdが死んでいる場合、コンテナが起動できない
　など。詳細は以下のサイトを参照
　　[Dockerコンテナ上のログ集約に関するまとめ](https://gist.github.com/naokirin/53ca77c857453b619c8d55591dfe36a6)
　　[Dockerのlogging driver: それぞれの特徴と使いどころ(json-file, syslog, journald, fluentd)](https://qiita.com/tkit/items/9eb2a952b986b35956cd)

# 対象のログ

## リアルタイムに出力されるログが対象

　・Fluentd / fluentd-ui
　・FluentBit
　・Filebeat
　・Logstash

## 既にあるログが対象

　・Embulk

[Fluentdのバッチ版Embulk(エンバルク)のまとめ](https://qiita.com/hiroysato/items/397f36c4838a0a93e352#_reference-8e8ce4efc201bffe79a3)
[Docker-composeを使ってEmbulk,Elasticsearch,Kibana環境を構築する](https://qiita.com/d0d0npa/items/16ff1a8d48fc52ffd340)
[Apacheのアクセスログを、EmbulkでElasticsearchに叩き込む](https://qiita.com/charon/items/2f6b2ed45d06b32cb068)

## ログを集めてGrafana Lokiに保存してGrafanaで見る

ログ収集するエージェントとしては、以下の事例あり
　promtail
　Fluentd
　FluentBit

[公式サイト](https://grafana.com/oss/loki/)
[GitHub](https://github.com/grafana/loki)

[fluent-plugin-grafana-loki を再度試した](http://tjtjtj.hatenablog.com/entry/2019/10/28/230000)
[fluent-plugin-grafana-loki](https://github.com/grafana/loki/tree/master/fluentd/fluent-plugin-grafana-loki)
[Dockerコンテナ環境でFluentdを使ってGrafana Lokiにログを送信してみた](https://tech.griphone.co.jp/2019/12/14/advent-calendar-20191214/)
[Grafana Lokiがメジャーリリースされたのでログ収集からダッシュボード化まで試してみた](https://qiita.com/wildmouse/items/078b329ff662f4fe69b3)
[Lokiで収集したログをGrafanaで見るハンズオン](https://qiita.com/keitamizuno526/items/af2525809721e9749a41)
[次世代のログ基盤 Grafana Lokiを始めよう! ](https://speakerdeck.com/uesyn/prometheus-meetup-tokyo-3-lets-start-the-loki)
[DockerコンテナのロギングにGrafana＋Lokiを試してみた](https://qiita.com/S_SenSq/items/3c69deb8497fb1910683)
[Grafana LokiをMinikubeで試す](https://qiita.com/sotoiwa/items/804155aca5ec6d52bac0)
[Prometheus likeなログ収集、Grafana Loki](https://note.mu/_k_e_k_e/n/n9bcfa4ef9278)
[Lokiとpromtailことはじめ](https://i101330.hatenablog.com/entry/2019/08/18/142339)
[Fluent BitからGrafana Lokiに転送するには](https://www.clear-code.com/blog/2019/7/31.html)
[Helmを使ってGrafana Lokiを試してみる](https://hakengineer.xyz/2019/08/26/post-2194/)
[Grafana Logging using Loki](https://medium.com/orangesys/grafana-logging-using-loki-276d04e0981c)
[Grafana Lokiを使ったKubelet Logging入門](https://qiita.com/yosshi_/items/6f4fa44cbbeb3d391275)

####Grafanaのアラート通知機能

https://grafana.com/grafana/dashboards

[Alerting Engine and Rules Guide](https://grafana.com/docs/grafana/latest/alerting/rules/)
[Metrics from the alert engine](https://grafana.com/docs/grafana/latest/alerting/metrics/)
[Alert Notifications](https://grafana.com/docs/grafana/latest/alerting/notifications/)
DingDing
Discord
Email
Google Hangouts Chat
Hipchat
Kafka
Line
Microsoft Teams
OpsGenie
Pagerduty
Prometheus Alertmanager
Pushover
Sensu
Slack
Squadcast
Telegram
Threema
VictorOps
Webhook
[Creating alert that can send SNMP Trap as a notification](https://community.grafana.com/t/creating-alert-that-can-send-snmp-trap-as-a-notification/3042)
>That is not supported right now

**Email**
[Grafanaでアラート時通知を設定する](http://rennnosukesann.hatenablog.com/entry/2019/01/29/183645)
[Grafana Eメール通知設定](https://techexpert.tips/ja/grafana-ja/grafana-e%E3%83%A1%E3%83%BC%E3%83%AB%E9%80%9A%E7%9F%A5%E8%A8%AD%E5%AE%9A/)
[Grafanaのメール設定で詰まった話](https://qiita.com/shinfrom/items/46b6174879e97dcab568)
[Grafana でメール通知](https://tech-lab.sios.jp/archives/16759)

**Slack**
[BLE経由で取得したデータの 可視化(Grafana) & アラート通知(Slack) を実施](https://www.n-novice.com/entry/2019/01/16/000000)
[Grafana で Elasticserch に蓄積したサーバーメトリクスの可視化+アラートのSlack通知環境を構築してみた (ニフクラ)](https://data.nifcloud.com/blog/grafana-connectiong-to-an-elasticsearch/)
[Prometheus+Grafanaでパフォーマンス監視をしています](http://blog.keepdata.jp/entry/2018/05/08/103540)

**Discord**
[Grafana5.2.0+でElasticsearch内のデータに対するAlertingを実行し、Discordに通知する](https://qiita.com/j-yama/items/93fa16389f73e05981b8)

**Teams**
[Prometheusのすすめ - Grafana で AlertをTeamsに通知するのは簡単です](https://qiita.com/nekoneck/items/fe3253280d79254d919e)

**webhook**
[Prometheus2とGrafana6によるシステム監視 GrafanaのAlertを使う](https://gato.intaa.net/archives/20703)


## ログを集めてElasticsearchに保存してKibanaで見る

**Elasticsearchで日本語全文検索**

デフォルトの状態だと対応していない日本語の形態素解析ライブラリを入れる必要あり

[Elasticsearchのための新しい形態素解析器 「Sudachi」](https://qiita.com/drafts/1206ed8101d3651465d7/edit)
[Elasticsearch に kuromoji を入れて日本語全文検索をする](https://qiita.com/mserizawa/items/8335d39cacb87f12b678)
[Elasticsearch 7.2.0 + Kuromoji + Kibana + docker-compose インストールメモ](https://qiita.com/kiyotaman/items/2527defb84a94bde3d7c)
[docker上で Filebeat nginx Module を使って nginxのlogをKibanaで表示させた](https://qiita.com/va034600/items/4cf599b3454286f77b6d)

その他に、「ICU(International Components for Unicodeの略)」(Unicodeの国際化サポートをしてくれるライブラリ)をインストールするか検討する

[Elasticsearchを日本語で使う設定のまとめ](https://qiita.com/shin_hayata/items/41c07923dbf58f13eec4)

個人的には、方法3がおすすめ

####方法1、Fluentd(または FluentBit) + Elasticsearch + Kibana

　FluentdをDockerコンテナで動かす場合で、
　Fluentdのプラグインを使いたい場合、
　プラグインをインストールしてDockerイメージを作る必要あり。
　ElastcsearchのプラグインをインストールしてDockerイメージを
　作る例は、[fluent/fluentd](https://hub.dockehttps://qiita.com/kiyotaman/items/2527defb84a94bde3d7c.com/r/fluent/fluentd/)を参照。
　
　[dockerでfluentdを動かすときはudpも意識しましょう](https://qiita.com/devneko/items/d598df1ba7a38bbdf730)
　[あんまり知られてない機能について](https://qiita.com/repeatedly/items/e882fdb46dfe85d9556f)
　[td-agent(fluentd) の monitor_agent で取得出来る情報を Graphite + Grafana で見る試み](https://inokara.hateblo.jp/entry/2014/05/31/081249)
　[Fluent-plugin-elasticsearch v2.8.0対応でわかったElasticsearch 6.0以降の動向]
(https://www.clear-code.com/blog/2018/3/7.html)
　[fluentdのnginxアクセスログ取得をdockerで試す](https://medium.com/nyle-engineering-blog/fluentd%E3%81%AEnginx%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%AD%E3%82%B0%E5%8F%96%E5%BE%97%E3%82%92docker%E3%81%A7%E8%A9%A6%E3%81%99-bf600b1f3389)
　[Docker初心者が、Nginxのログを fluentd + elasticsearch + kibana で可視化してみた](https://qiita.com/zgmf_mbfp03/items/0697cc827efa89e5d93e)

　[fluentd-uiでdockerコンテナのpache2のログを収集コンテナに転送する方法](https://qiita.com/mailei/items/581e3d4a6016333d8b12)
　[fluentd-uiを起動してみた](https://qiita.com/tukiyo3/items/949250e52931f5607124)

　[fluent/fluent-bit](https://hub.docker.com/r/fluent/fluent-bit)
　[IoTや組み込み向けのデータコレクタ、FluentBitについて](http://nokute.hatenablog.com/entry/2016/09/21/221402)
　[Fluent Bitを試してみる。](https://qiita.com/ksoeda@github/items/47fe5732637a923e5ed6)
　[貧者の GKE / FluentBit でログ収集](https://qiita.com/apstndb/items/78482a26b13b10eded0e)
　[FluentBitのGolang製のプラグインのDockerfileを作った話](https://www.clear-code.com/blog/2019/7/30.html)
　[Amazon Linux で Fluent Bit を動かしてみた](https://dev.classmethod.jp/cloud/amazon-linux-fluent-bit/)
　[Docker Logging with Fluent Bit and Elasticsearch](https://fluentbit.io/articles/docker-logging-elasticsearch/)

####方法2、Filebeat + (Logstash) + Elasticsearch + Kibana

　Logstashを採用するかFilebeatだけで対応可能かは動作確認して問題ないか確認して決める必要がある

　[Filebeat - Modules](https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-modules.html)
　[docker上で Filebeat nginx Module を使って nginxのlogをKibanaで表示させた](https://qiita.com/va034600/items/4cf599b3454286f77b6d)
　[dockerでElasticsearch+logstash+kibanaを立ち上げる](https://catalina1344.hatenablog.jp/entry/2019/01/20/170821)
　[Filebeat にモジュール機能が追加され、ログ可視化が簡単になりました](https://dev.classmethod.jp/server-side/elasticsearch/released-filebeat-modules-apache/)
　[MySQLのlogを可視化する](https://qiita.com/takumi-suzuki/items/e88db63a1bfe4295d580)
　[docker上で Filebeat nginx Module を使って nginxのlogをKibanaで表示させた](https://qiita.com/va034600/items/4cf599b3454286f77b6d)
[Filebeatの性能チューニングポイントまとめ](https://qiita.com/hssh2_bin/items/148945c149074c6dce0f)

####方法3、方法1と方法2の両方

検討例)
・Filebeatの[Filebeat - Modules](https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-modules.html)で、Nginx、Redis、MySQLなどの情報を収集
→MySQLはエラーログとスロークエリーログのみ対応
→バグで収集できないパターンもあるのでGitHubのissueを確認すること
　例) Filebeat7.4のバグでMySQLのエラーログが収集されない。7.5で修正される。
　　　導入時期によって１つ前のバージョンにするか新しいバージョンが出てから
　　　再度検証か検討する
　　　[Mysql filebeat module [mysql.error] no result found](https://discuss.elastic.co/t/mysql-filebeat-module-mysql-error-no-result-found/203433)
　　　[Mysql filebeat module [mysql.error] ingest pipeline issue #14076](https://github.com/elastic/beats/issues/14076)
→収集できているのにKibanaのDashboardで表示されない場合もある
　例) nginxのアクセスログ
　　　OS名かOSバージョンのどちらかしかない状態でグラフに表示されない
　　　(Filebeat 7.4.2。ブラウザはFirefoxで確認)
　　　→user_agent.os.nameのみが取得できている
　　　 user_agent.os.versionが取得できてない
　　　ダッシュボードの設定では両方の値が取得できているもののグラフを表示
　　　取得できていれば表示される。バージョン取得のバグの可能性あり

　例) nginx(コンテナのタイムゾーンはAsia/Tokyo。アクセスログ/エラーログ)
　　アクセスログの日付はKibanaで日本の日時で表示されるが、
　　エラーログの日付はKibanaで+9時間の日時で表示された
　　(Filebeat 7.4.2で確認)
　　→ Filebeatの設定に以下を追加することで解決。
　　　なお、コンテナのタイムゾーンを変更していない場合は問題は発生しません。

```
processors:
 - drop_fields.fields: ['event.timezone']
 - add_fields:
    target: event
    fields:
     timezone:  'Asia/Tokyo'
```
・Fluentdで、FilebeatのModuleがないログの収集
→ Fluentdを使わずにLogstashまたはFilebeat+Logstashを採用するパターンもある。

[Elasticsearchのタイムゾーン問題](https://qiita.com/hssh2_bin/items/0c4cbd1157ea230549a9)

#### アラート通知

[Elasticsearchのデータを基にアラート通知する方法の調査](https://qiita.com/rururu_kenken/items/6207ab68378b70f408bb)

# OSS のログ管理システム [Graylog](https://github.com/Graylog2)

ログの収集
ログの検索
ダッシュボードの作成
ログを基にしたアラート通知

[Graylog ではじめるログ管理](https://techlife.cookpad.com/entry/2015/11/25/190133)
[Dockerを使ってログ監視ツールである「graylog」構築する手順](https://mebee.info/2020/05/29/post-8744/)
[Send Syslog Data to Graylog](https://docs.fluentd.org/how-to-guides/graylog2)
[fluentd-graylog](https://github.com/greggilbert/fluentd-graylog)
[Bunyan JSON Logs with Fluentd and Graylog](https://blog.insiderattack.net/bunyan-json-logs-with-fluentd-and-graylog-187a23b49540)
[Managing Logs with Graylog & Fluentd-2](https://www.devinitiate.com/managing-logs-with-graylog-fluentd-2/)
[Graylog で log を管理する](https://techblog.szksh.cloud/graylog/)

# Dockerログのログローテート設定

Docker の出すログファイルでディスクが 100%になることを防ぐため、
max-size、max-fileは必ず設定する必要があります。
[Configure the default logging driver](https://docs.docker.com/config/containers/logging/configure/)

# Dockerコンテナのログファイルをログローテート

Dockerコンテナ起動時にDockerコンテナのログディレクトリを
Dockerホストのディレクトリとマウントした場合

[dockerコンテナ内のnginxにログを開き直させる方法（logrotate）](https://www.teradas.net/archives/24795/)
[dockerコンテナ上のuwsgiとnginxのログローテート](https://qiita.com/westjustice/items/477b4e9ad78d91668d3d)
[DockerfileでNginxの起動とログのローテーションまで](https://qiita.com/k7tak29/items/993ba3af8b0ac62a02c5)

# 参考URL

[ログ収集ツールの比較](https://qiita.com/kazookie/items/eef3071a0667cb4d5136)
[Elastic Stackにちょうど良いKafka　パート1](https://www.elastic.co/jp/blog/just-enough-kafka-for-the-elastic-stack-part1)
[apache-kafka – LogstashとKafkaの違い](https://codeday.me/jp/qa/20190512/803555.html)
[ログ収集基盤のFluentdとFlume NG、どちらが使いやすい？](https://tech.nikkeibp.co.jp/it/article/COLUMN/20121122/439421/)

Beatsのdocker-composeの例や設定ファイル(yaml)は公式のGitHubを参照
[elastic/beats](https://github.com/elastic/beats/tree/master/filebeat)
[beats/deploy/docker/](https://github.com/elastic/beats/tree/master/deploy/docker)
[beats/deploy/kubernetes/](https://github.com/elastic/beats/tree/master/deploy/kubernetes)