経緯
- Docker で動かしている バックエンドアプリのログを ElasticSearch + Kibana で閲覧したくなった (ElasticSearch + Kibana の構築手順はここでは述べない)
- ElasticSearch のログ収集といえば fluentd だが、fluentd より軽量らしい fluent-bit を採用してみた
対応
- 公式ドキュメントを見て作成
- バックエンドアプリコンテナがあるサーバに fluent-bit の Docker コンテナを稼働させるようにする
- fluent-bit が待ち受け状態になったことを確認したら、ログを送信するバックエンドアプリの方にも fluent-bit にログを送る設定を仕込む
構成
fluent-bit の設定
- parser で json を指定すると、json で出力したアプリログを ElasticSearch に JSON オブジェクトとして登録してくれる
- 逆に指定しないと String として登録されてしまう
- ローカル環境で試験的に試したものなので、本番環境に採用するときは適宜変えてください
/
├ docker-compose.yml
├ fluent-bit.conf
└ parsers.conf
docker-compose.yml
version: '3.7'
services:
fluentd:
image: fluent/fluent-bit:1.8.8-debug # docker exec で コンテナの中に入りたければデバッグバージョンが必要
container_name: fluent-bit
ports:
- "24224:24224" # ポート固定を指定
volumes: # テストのためボリュームマウント
- type: bind
source: "./fluent-bit.conf"
target: "/fluent-bit/etc/fluent-bit.conf"
- type: bind
source: "./parser.conf"
target: "/fluent-bit/etc/parser.conf"
# バックエンドアプリとネットワークを合わせる
networks:
- "my-network"
networks:
my-network:
external:
name: my-network
fluent-bit.conf
[SERVICE]
Flush 1
Grace 30
Log_Level debug
Parsers_File /fluent-bit/etc/parsers.conf
[INPUT]
Name forward
Listen 0.0.0.0
Port 24224
[FILTER]
Name parser
Match *
Key_Name log
Parser docker
[OUTPUT]
Name es
Host my.elasticsearch.server
HTTP_User elastic
HTTP_Passwd mypassword
Port 443
Type doc
tls On
Generate_ID On
Logstash_Format On
Logstash_Prefix my-backend
Logstash_DateFormat %Y-%m-%d
Include_Tag_Key On
parsers.conf
[PARSER]
Name docker
Format json
Time_Key timestamp
Time_Format %Y-%m-%dT%H:%M:%S.%L%Z
バックエンドアプリの設定
- ロギングドライバーを fluent-bit に設定する
- 注意点
- fluent-bit の待ち受け TCP ポートを固定にしているので、ECS や K8S に転用すると、ローリングアップデートが出来ない問題があり
- ホスト名指定にしてやれば上手くいくと思われる
docker コマンドで起動する場合
- log-driver オプション 及び log-opt オプションを付けて起動
docker container run \
--log-driver=fluentd \
--log-opt fluentd-address=localhost:24224 \
--log-opt tag=docker.{{.Name}} \
my-image
docker-compose で起動する場合
- logging 項目に記載する
version: "3.7"
services:
my-api:
container_name: my-api
logging:
driver: "fluentd"
options:
fluentd-address: "localhost:24224"
tag: "docker.{{.Name}}"
restart: always
networks:
- "my-network"
networks:
my-network:
external:
name: my-network
Kibana で Index を登録し確認できれば OK