概要
Gitlab のコンテナの標準出力のログは JSON 形式ではないので docker の fluentd ドライバが使えません
なのでコンテナ内に出力されるアプリケーションのログファイルを見る必要があります
ポイントはコンテナ内のログファイルをホストにマウントする点です
環境
- Gitlab-ee 14.7.7
- fluentd 1.3.2
- fluent-plugin-elasticsearch 4.3.3
- elasticsearch 7.17.1
- elasticsearch 7.17.3
- kibana 7.17.3
ElasticSearch 起動
-
docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.17.3
Kibana 起動
-
docker run -d -e ELASTICSEARCH_HOSTS=http://192.168.100.10:9200 -p 5601:5601 docker.elastic.co/kibana/kibana:7.17.3
fluentd ビルド&起動
- vim Dockerfile
FROM fluent/fluentd
RUN apk add --update --virtual .build-deps \
sudo build-base ruby-dev \
&& sudo gem install \
elasticsearch -v 7.17.1 \
&& sudo gem install \
fluent-plugin-elasticsearch -v 4.3.3 \
&& sudo gem sources --clear-all \
&& apk del .build-deps \
&& rm -rf /var/cache/apk/* \
/home/fluent/.gem/ruby/2.5.0/cache/*.gem
- vim fluent.conf
<source>
@type tail
format json
path /fluentd/gitlab_log/production_json.log
pos_file /fluentd/gitlab_log/production_json.log.pos
tag gitlab.production
keep_time_key true
</source>
<match gitlab.production>
@type copy
<store>
@type stdout
</store>
<store>
@type elasticsearch
host 192.168.100.10
port 9200
index_name gitlab.production
type_name fluentd
logstash_format true
time_key time
</store>
</match>
- docker build -t my_fluentd .
-
docker run -d -v $(pwd):/fluentd/etc -v /path/to/log/gitlab-rails:/fluentd/gitlab_log -e FLUENTD_CONF=fluent.conf -e FLUENT_UID=998 my_fluentd
ポイント
- Gitlab のログをホスト側でマウントしてそれを tail で飛ばす
- 上記の場合は fluentd コンテナの
/fluentd/gitlab_log
にログをマウントしている - マウント先は
/fluentd
配下でないと権限がないと言われて怒られる - また fluent ユーザの UID は 998 にしている、998は Gitlab 上で動作している git ユーザの UID でログファイルの権限が git ユーザの権限になっている、fluent ユーザのデフォルトの UID は 1000 になっており 1000 のまま fluentd コンテンを起動するとログの権限が 1000 になり Gitlab からログが書き込めずエラーになるのでそれの対応になる
- production_json.log にはタイムスタンプ用に time フィールドがあるが
keep_time_key: true
を設定しないと消えるので注意 - Elasticsearch のバージョンに合わせて elasticsearch-ruby のバージョンも合わせる必要がある
- ログファイルの権限と fluentd 側の権限 (uid, gid) は合わせる必要がありそう
最後に
他のログも同じように転送することができます