docker-composeでサービス運用しているなら設定しておきたいログローテート
目次
この記事はQiitaに投稿していたものです。 このブログに自身のアウトプットをまとめるための再投稿です。
ことの始まり
社内で使用しているサービスにいくらリクエストを送っても返事がなくなったので調査。
原因
サーバーがdiskfull状態だったことでファイルの書き込み処理が行えず、ほぼほぼ何もできなくなっていたことが原因。 なぜ、そんなに容量が圧迫されてしまったのか調べたところdockerのログが膨れ上がって容量を圧迫していた。
対策
docker-composeを使用してサービスを運用しているケースだったので、コンテナごとにログファイルの上限サイズと保持するファイル数を設定した。 docker-compose.ymlに以下のように書くことで上限サイズとファイル数を設定できるみたい。
version: '2'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
logging: # ログ記録の設定
driver: "json-file" # ロギングドライバの指定
options:
max-size: "1k" # 上限サイズを1KBに設定
max-file: "2" # ファイル数は2まで
上記の設定で、webコンテナから吐き出されるlogファイルは1KBに到達するとロールオーバー(別ファイルに繰り出)されます。
実際に吐かれたログを見てみると、確かに1KB程で コンテナID-json.log.1
とロールオーバーされたものが出来ています。
# docker for macだと、このpathにログファイルは存在しません。(hyperkit vm上で動いているため)
/var/lib/docker/containers/8918bd3a1b22eb04f9538ca8df869ef1588f27aefffad37efe4c09d1bd079ab8 # ls -la
total 48
(略
-rw-r----- 1 root root 424 Apr 28 02:51 8918bd3a1b22eb04f9538ca8df869ef1588f27aefffad37efe4c09d1bd079ab8-json.log
-rw-r----- 1 root root 1020 Apr 28 02:51 8918bd3a1b22eb04f9538ca8df869ef1588f27aefffad37efe4c09d1bd079ab8-json.log.1
(略
これで、次のロールオーバーが発生すると max-file
が2になっているため、 コンテナID-json.log.1
のものが削除されて今まで コンテナID-json.log
だったものが コンテナID-json.log.1
となります。
このように、ロールオーバーする設定にすると、 docker-compose logs コンテナ名
で表示されるログは コンテナID-json.log
のみになるので、前のものを確認したいときは直接見に行ってください。
ログの設定についてもっとしたい場合は、 公式ドキュメントを確認してください。 また、オプションにどんなものが使えるか知りたい場合は、こちらを見てみてください。
設定できたか確認
しっかり設定できた確認したい場合は以下のコマンドで確認することができます。
docker inspect コンテナID | grep LogConfig -A 5
"LogConfig": {
"Type": "json-file",
"Config": {
"max-file": "2",
"max-size": "1k"
}
おまけ
docker for macでローテートされたログを見に行きたい場合は、特権コンテナに入って var/lib/docker/containers/コンテナID/
を見に行くと見れます。
特権コンテナの入り方は以下のような感じです。
docker run -it --rm --privileged --pid=host justincormack/nsenter1
終わりに
ログローテートの設定をせずにdockerを使ってサービスを運用していると、肥大し続けるlogファイルに障害を起こされます。 時限爆弾みたいなものなので、設定してなければ早めに対処することをお勧めします。