Posted at

docker logs で表示されるログの保存場所とローテート方法

More than 1 year has passed since last update.

docker でコンテナを起動したとき、コマンドとして指定したプロセスが標準出力・標準エラー出力に吐いたログは docker logs ${コンテナID} で閲覧できる。

自分で docker のサービスを運用するにあたって、このログが溜まりつづけてホスト側のディスクを圧迫してしまうのではないか?という懸念があったので、ログの保存場所やローテート方法を調べた。


ログの保存場所

そもそも docker にはこのログの保存の仕方をカスタマイズできる Logging Driver という仕組みがあるのだが、デフォルトでは json-file というドライバーが利用されている。

$ docker info | grep Log

Logging Driver: json-file

ドライバーが json-file の場合、docker inspect コマンドでログの保存場所を調べることができる。(他のドライバーについては未確認。)

$ docker inspect 8f18b6bfb58a | grep 'LogPath'

"LogPath": "/var/lib/docker/containers/8f18b6bfb58aa60ea992374604532f75110dd07742cb511af516d72e63b44138/8f18b6bfb58aa60ea992374604532f75110dd07742cb511af516d72e63b44138-json.log",

$ cat /var/lib/docker/containers/8f18b6bfb58aa60ea992374604532f75110dd07742cb511af516d72e63b44138/8f18b6bfb58aa60ea992374604532f75110dd07742cb511af516d72e63b44138-json.log
## docker logs 8f18b6bfb58a したときと同じ出力が得られる


ログのローテート方法

上記のログはデフォルトではローテートされないので、docker run するときのオプションでローテート設定を指定してやる必要がある。

--log-opt max-size=[0-9]+[kmg]

--log-opt max-file=[0-9]+

100MB ごとにローテートして 10 世代まで保存するならこんな感じで docker run するとよい。

docker run -d --log-opt max-size=100m --log-opt max-file=10 my-docker-image

1 コンテナを延々と立ち上げっぱなしにするような用途で、標準出力・標準エラー出力に大量のログを出力しているとディスクを圧迫してしまう可能性があるので、設定しておいたほうがいいかも。


参考資料