Dockerコンテナのデフォルトログ出力設定

0 件のコメント

今回は「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のデフォルトログ管理方法」についてまとめました。 参考になったでしょうか? 本記事がお役に立っていると嬉しいです!!

参考記事

最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!