LoginSignup
20
15

More than 5 years have passed since last update.

dockerコンテナのログをelasticsearchに集めて解析する方法

Posted at

TL;DR

dockerコンテナのログをfluentdに集める方法 の続編です.
この記事から読み始めることもできます.

  • Docker logdriverの機能を利用して,コンテナのログをelasticsearchに蓄積する仕組みを作ります
    • https://github.com/myoshimi/es-docker-logging にdocker-compose.ymlがあります
    • dockerコンテナのログをfluentd形式で送信します(logdriverの設定)
    • fluentdコンテナでログを受け取り,elasticsearchに蓄積します
    • kibanaで蓄積された情報を可視化,解析できます

コンテナ構成例

  • 下記のLogsパッケージ部分を作ります.
    • 3つのコンテナから成ります
      • データ転送サーバ Fluentd (fluentd)
      • 全文検索エンジン Elasticsearch (es)
      • 可視化サーバ Kibana
    • 同じホストで稼働させたDockerコンテナのログを,Fluentdで受けて,Elasticsearchに蓄積します
    • 蓄積されたデータは,(管理者が)Kibanaを通して確認できます
    • コンテナ自体のログは取れませんので,別途,稼働状況を確認する仕組みが必要です

docker-es.jpg

コンテナの立ち上げ

事前準備

  • elasticsearchコンテナを稼働させるために, vm.max_map_countを変更する必要があるかもしれません
    • vm.max_map_count = 262144 に設定してください
$ sudo vi /etc/sysctl.conf

#以下の行を追加
vm.max_map_count = 262144

# 設定変更を反映
$ sudo sysctl --system

docker-compose.ymlでコンテナの立ち上げ

  • git cloneしてdocker-compose.ymlをビルドして立ち上げます
    • 前掲の図の, Logsのコンテナが立ち上がります
    • 受信用fluentdコンテナにuken/fluent-plugin-elasticsearchプラグインをインストールする必要があるので, docker-compose build を実行します
$ git clone https://github.com/myoshimi/es-docker-logging
$ cd es-docker-logging
$ docker-compose build

...<snip>....
Building fluentd
Step 1/2 : FROM fluent/fluentd:v1.3.2
 ---> 9406ff63f205
Step 2/2 : RUN gem install fluent-plugin-elasticsearch
 ---> Running in c75df6c30c9a
Successfully installed excon-0.62.0
...<snip>....
Successfully tagged es-docker-logging_fluentd:latest

$ docker-compose up -d

立ち上がるコンテナは,以下の3つです

es : Elasticsearch

  • oss版コンテナを使用しています
  • 9200/tcp, 9300/tcpがexposeされています
    • コンテナのログ確認,集約だけであれば,kibana経由で見て,直接見ることはないのでので,portsにはしていません
  • ${PWD}/esが,elasticsearchのデータの不揮発ボリュームとしてマウントされます
    • 注意: es/{data,config}のディレクトリは,uid=1000, gid=1000である必要があります
      • 不安な場合は sudo chown -R 1000:1000 es してください

kibana : Kibana

  • oss版コンテナを使用しています
  • 5601/tcpでportsしていますので,コンテナ立ち上げ後,http://<URL>:5601/にブラウザでアクセスすると,Kibanaにアクセスできます
    • ホストのポートが開いている場合

fluentd : fluentd

  • dockerコンテナのログをfluentdに集める方法のfluentdコンテナとほぼ同じです
    • ローカルディレクトリの log ディレクトリが不揮発ボリュームとして使用されます
  • 24224/tcp, 24224/udpがportsされており,別のコンテナからのfluentd出力を受け付けます
    • 読み込むfluent.confのみ,違いがあります(次節で説明)

fluent.confの設定

  • 受け付けた docker.*** タグでマッチしたログを, ローカルディレクトリの log に蓄積し,その後,elasticsearchへ転送しています
    • 実行ログは, es-docker-logging/log にファイルとして保存されます
    • 同じログが,elasticsearchに投入されます
  <match docker.**>
    @type copy
    <store>
        @type file
        @id   output_docker1
        path         /fluentd/log/docker.*.log
        symlink_path /fluentd/log/docker.log
        append       true
        time_slice_format %Y%m%d
        time_slice_wait   1m
        time_format       %Y%m%dT%H%M%S%z
    </store>
    <store>
      @type elasticsearch
      host es
      port 9200
      logstash_format true
    </store>
  </match>

ログ送信側

docker run -d \
  --log-driver=fluentd \
  --log-opt fluentd-address=localhost:24224 \
  --log-opt tag=docker.{{.Name}} \
  nginx:latest

動作確認

  • コンテナのログがfluentd経由でesに蓄積された情報を,kibanaで確認
    • http://<URL>:5601/で確認できます
    • kibanaの[Discover]をクリックし,[Index Pattern]としてlogstash-*を入力
    • [Time filter field]に@timestampを選択
    • [Create Index Pattern]をクリック
    • [Discover]に戻ると,データが集まってきていることを確認できます

elastic0.jpg

参考

20
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
15