今回は「Dockerのデフォルトログ管理方法(ロギングドライバー、保存先、ローテート)」についてまとめます。
概要
ロギングドライバー
Dockerのログは「ロギングドライバー(Logging Driver)」という出力方法の変更が簡単にできる仕組みを利用して出力されています。 出力方法はnone、json-file、fluentdなど組み込みでもいくつか選択肢があります(以下の表を参照)。 何も指定していないデフォルトは json-file ロギングドライバーになっています。
ドライバー | 説明 |
---|---|
none |
ログ出力しない。 |
local |
独自フォーマットでローカル保存。 |
json-file |
(デフォルト)JSONフォーマットでローカル保存。 |
syslog |
syslog へ書き込み。ホスト上で syslog が起動している必要あり。 |
journald |
journald へ書き込み。ホスト上で journald が起動している必要あり。 |
gelf |
Graylog や Logstash といった Graylog Extended Log Format (GELF) エンドポイント へ書き込み。 |
fluentd |
fluentd へフォワード。ホスト上で fluentd が起動している必要あり。 |
awslogs |
Amazon CloudWatch Logs へ書き込み。 |
splunk |
HTTP イベントコントローラ を利用して splunk へ書き込み。 |
etwlogs |
Event Tracing for Windows (ETW) へ書き込み。Windows上でのみ利用可能。 |
gcplogs |
Google Cloud Platform Logging へ書き込み。 |
logentried |
Rapid7 へ書き込み。 |
ログ出力設定(ロギングドライバーの変更)
ログ出力方法の設定に相当するロギングドライバーの設定は以下の2通りがあります。- 「Docker起動時のデフォルト設定」
- 「コンテナ起動時のオプション設定」
基本的には「Docker起動時のデフォルト設定」が利用されますが、「コンテナ起動時のオプション設定」を行うことでログ出力設定を上書きすることができます。
本記事では「Docker起動時のデフォルト設定」修正方法について後述します。
ログ確認
Dockerのログ確認はdocker logs
で確認できます。この docker logs
が利用できるのは以下の3ドライバーを指定しているときのみです。
local
json-file
journald
現在設定の確認方法
現在のデフォルトのロギングドライバーが何かを確認したい場合、以下のコマンドで確認。
1 | docker info --format '{{.LoggingDriver}}' |
起動中コンテナのロギングドライバーが何かを確認したい場合、以下のコマンドで確認。
1 | docker inspect --format '{{.HostConfig.LogConfig.Type}}' <CONTAINER_NAME> |
デフォルト設定の修正方法
デフォルトのロギングドライバー 設定を行いたい場合、設定ファイル(daemon.json)を以下に配置して Docker を起動します。
- Windows
C:\ProgramData\docker\config\daemon.json
- Linux
/etc/docker/daemon.json
daemon.json(サンプル)
1 2 3 4 5 6 7 8 9 | { "log-driver" : "json-file" , "log-opts" : { "max-size" : "10m" , "max-file" : "3" , "labels" : "production_status" , "env" : "os,customer" } } |
- log-driver
- ロギングドライバーを指定します。
指定できる値は前述の「ロギングドライバー」の表にある通りです。
デフォルトは
json-file
。 - log-opts
- ロギングドライバーに対するオプション設定。
log-driver に指定したロギングドライバーによって指定できる値が異なるので、各ロギングドライバーのオプションを確認する必要があります。
デフォルトの
json-file
に関するオプションは後述しています。
json-file ロギングドライバー
ログ出力先
json-file を指定した時のログファイル出力先は以下のコマンドを実行することで確認できます。
1 | docker inspect -f "{{.LogPath}}" <CONTAINER_NAME> |
オプション設定
log-driver: json-file
のときに指定できるオプションは以下の通りです。
なお、指定する値は数値や真偽値だったとしても文字列として与えます。
オプション | デフォルト | 説明 |
---|---|---|
max-size | -1 (無制限) | ログファイルの最大サイズ。キロバイト k 、メガバイト m 、 ギガバイト g の単位を使って指定。 |
max-file | 1 | 保持できるログファイルの最大数。 max-size オプションとあわせて設定。 |
labels | (なし) | Dockerコンテナ起動時に指定されているラベルを出力。カンマ区切りで複数指定。 |
env | (なし) | Dockerコンテナ起動時に指定された環境変数を出力。カンマ区切りで複数指定。 |
env-regex | (なし) | env とほぼ同じ。正規表現で出力を指定。 |
compress | disabled | 圧縮するかどうかを指定。true / false のハズ…。。 |
ログローテート設定例
ログローテートさせたいような場合のサンプルは以下になります。
デフォルト設定(daemon.json)の場合
1 2 3 4 5 6 7 | { "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } } |
コマンドオプションの場合
1 2 3 4 5 6 | docker run \ --name test \ --log-opt max-size="10m" \ --log-opt max-file="3" \ nginx:1.17.2-alpine \ echo Hello World |
labels や env の利用例
labels や env を使うようなサンプルは以下になります。
コマンドオプションで起動
1 2 3 4 5 6 7 8 9 10 | docker run \ --name test \ --log-opt labels=label1,label2 \ --log-opt env=env1,env2 \ --label label1="LabelSample1" \ --label label2="LabelSample2" \ --env env1="EnvSample1" \ --env env2="EnvSample2" \ nginx:1.17.2-alpine \ echo Hello Worlds |
出力されるログ
1 2 3 4 5 6 7 8 9 10 11 | { "log": "Hello World\n", "stream": "stdout", "attrs": { "env1": "EnvSample1", "env2": "EnvSample2", "label1": "LabelSample1", "label2": "LabelSample2" }, "time": "2019-11-16T07:36:59.468646676Z" } |
今回は「Dockerのデフォルトログ管理方法」についてまとめました。 参考になったでしょうか? 本記事がお役に立っていると嬉しいです!!
参考記事
- Docker Docs - Configure logging drivers
- Docker Docs - JSON File logging driver
- Docker Docs - docker run
- Qiita - docker logs で表示されるログの保存場所とローテート方法
- Qiita - Dockerのlogging driver: それぞれの特徴と使いどころ(json-file, syslog, journald, fluentd)
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!