2026年5月21日

2026年5月21日

Dockerのログドライバーを設定する方法|json-fileのローテーションとsyslogへの送信

Dockerのコンテナが標準出力・標準エラー出力に書いたログは、ログドライバー によって保存先が決まります。初期設定の json-file はホストのファイルにログを書き続けるため、設定しないまま長く動かすとディスクを圧迫することがあります。

この記事では、Linux(systemdで動くDocker Engine)を前提に、ログドライバーの確認方法、json-file のローテーション設定、syslog ドライバーでログを送る設定を説明します。内容は2026年10月時点のDocker公式ドキュメントで確認し、コマンドは手元のDockerで動作を確かめています。

主なログドライバー

ドライバー 保存先 docker logs で読めるか
json-file ホストのファイル(JSON形式)。初期値 読める
local ホストのファイル(独自形式、初期設定でローテーションと圧縮あり) 読める
journald ホストのsystemd-journald 読める
syslog ホストのsyslog、またはネットワーク上のsyslogサーバー 読める(後述のデュアルロギングによる)
fluentd など 外部のログ収集基盤 読める(同上)
none 保存しない 読めない

1つのコンテナに設定できるドライバーは1つだけです。"log-driver": ["json-file", "syslog"] のように複数を並べることはできません。

現在の設定を確認する

# Dockerデーモンの既定のログドライバー
docker info --format '{{.LoggingDriver}}'

# 個々のコンテナが使っているドライバーとオプション
docker inspect -f '{{.HostConfig.LogConfig.Type}} {{.HostConfig.LogConfig.Config}}' コンテナ名

# json-file の場合、ログファイルの場所
docker inspect -f '{{.LogPath}}' コンテナ名

設定の基本:daemon.json と再作成

ホスト全体の既定値は /etc/docker/daemon.json で設定します(ファイルが無ければ作ります)。設定のルールは次のとおりです。

  • log-opts の値は すべて文字列 で書く。"max-file": 3 ではなく "max-file": "3"
  • 変更後はDockerデーモンの再起動が必要
  • 変更は これから作るコンテナだけ に効く。既存のコンテナは作り直すまで元の設定のまま

JSONの書き間違いがあるとDockerが起動しなくなるので、再起動の前に設定ファイルを検査します。

sudo dockerd --validate --config-file /etc/docker/daemon.json
sudo systemctl restart docker

Docker Desktopでは、ダッシュボードの Settings > Docker Engine で同じJSONを編集します。

json-file:ローテーションを設定する

json-file は、初期設定ではファイルの大きさに上限がなく、ローテーションもしません。次の設定で、1ファイル10MB・最大3ファイル(コンテナごとに最大約30MB)に抑えます。

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}
オプション 意味 初期値
max-size この大きさを超えたら新しいファイルに切り替える(k・m・g) 無制限
max-file 残すファイルの数。max-size を設定したときだけ有効 1
compress 切り替えた古いファイルを圧縮する false

保存したら検査してDockerを再起動し、既存のコンテナを作り直します。Docker Composeで管理しているコンテナは、次のコマンドで作り直せます(ボリュームのデータは残ります)。

docker compose up -d --force-recreate

ローテーションの設定をせずにディスクを手軽に守りたい場合は、初期設定でローテーションと圧縮をする local ドライバー("log-driver": "local")も選べます。公式ドキュメントも、多くの環境では local を勧めています。ただし local のファイルは独自形式なので、ログファイルを直接読む収集ツールを使っている場合は json-file のままにします。

syslog:ホストやログサーバーに送る

ネットワーク上のsyslogサーバーに送る

{
  "log-driver": "syslog",
  "log-opts": {
    "syslog-address": "udp://192.0.2.10:514",
    "syslog-facility": "local7",
    "tag": "docker-{{.Name}}"
  }
}
オプション 意味
syslog-address 送り先。udp://ホスト:ポート、tcp://ホスト:ポート、tcp+tls://ホスト:ポート、unix:///パス、unixgram:///パス
syslog-facility syslogのファシリティ(daemon、local0〜local7 など)
tag syslogのプログラム名の位置に入る文字列。初期値はコンテナIDの先頭12文字。{{.Name}} でコンテナ名を使える
syslog-format rfc3164・rfc5424・rfc5424micro。省略時はホスト名なしのUnix syslog形式
syslog-tls-ca-cert など tcp+tls のときの証明書の指定

上の設定で web というコンテナが hello と出力すると、syslogサーバーには次のような1行が届きます(先頭の <190> はファシリティ local7 と重要度 info を表す値です)。

<190>Nov 10 06:40:24 docker-web[120]: hello

syslog-address を省略すると、ホストのsyslog(Unixソケット)に送ります。ホストでsyslogを受け取るサービスが動いていないと、コンテナの起動時に failed to initialize logging driver: Unix syslog delivery error というエラーになり、コンテナが起動しません。

受け取る側(rsyslog)の設定例

ログサーバーがrsyslogの場合、UDPの514番で受信し、Dockerのログを別のファイルに分ける設定の例です。/etc/rsyslog.d/10-docker.conf として保存します。

module(load="imudp")
input(type="imudp" port="514")

if $programname startswith 'docker-' then /var/log/docker-containers.log
& stop
sudo systemctl restart rsyslog
sudo tail -f /var/log/docker-containers.log

ログサーバーのファイアウォールでは、514番への接続をDockerホストからだけ許可します。UDPは届かなかったログを再送しないため、取りこぼしを避けたい場合は tcp://、経路を暗号化したい場合は tcp+tls:// を使います(受信側もTCP・TLSで待ち受ける設定が必要です)。

syslogドライバーでも docker logs を使える(デュアルロギング)

syslog や fluentd のように、それ自体ではログを読み出せないドライバーを使うと、Dockerはホストにもログの写しを local 形式で保存します(デュアルロギング)。そのため docker logs でもログを確認できます。

写しは初期設定でコンテナごとに20MB×5ファイルまでです。ログはsyslogサーバーでだけ見るのでホストに残したくない場合は、log-opts に "cache-disabled": "true" を加えます。この場合、docker logs はエラーになります。

コンテナごとに指定する

既定値とは別のドライバーを一部のコンテナだけで使う場合は、起動時に指定します。

docker run -d --name web \
  --log-driver syslog \
  --log-opt syslog-address=udp://192.0.2.10:514 \
  --log-opt tag="docker-{{.Name}}" \
  nginx

Docker Composeでは logging で指定します。

services:
  web:
    image: nginx
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

ログを確認する

# 最新の100行を表示し、その後の出力も追いかける
docker logs --tail 100 -f コンテナ名

# 30分前以降のログを時刻付きで表示する
docker logs --since 30m -t コンテナ名

docker logs の詳しい使い方とログの肥大化への対処は Dockerのログを確認・管理する方法 で説明しています。

うまくいかないときの確認

症状 確認すること
daemon.json を変えたらDockerが起動しない dockerd --validate --config-file でJSONの誤りを確認する。log-opts の値を数値で書いていないか。journalctl -u docker にエラーが出る
設定したのにローテーションされない 既存のコンテナは作り直さないと変わらない。docker inspect で LogConfig を確認する
max-file だけ設定しても1ファイルのまま max-file は max-size と一緒に設定したときだけ有効
Unix syslog delivery error でコンテナが起動しない syslog-address を省略していて、ホストにsyslogを受け取るサービスが無い。送り先を指定するか、ホストでsyslogを動かす
syslogサーバーにログが届かない 送り先のアドレス・ポート、ファイアウォール、受信側が同じプロトコル(UDP/TCP)で待ち受けているか
configured logging driver does not support reading cache-disabled を true にしている。ログはsyslogサーバー側で確認する

まとめ

  • Dockerの既定のログドライバーは json-file。上限が無いので max-size と max-file でローテーションを設定する
  • daemon.json の log-opts の値は文字列で書き、変更後はDockerを再起動し、既存のコンテナは作り直す
  • syslogに送るときは syslog-address・syslog-facility・tag を設定する。送り先を省略するとホストのsyslogに送る
  • 1つのコンテナに使えるドライバーは1つ。syslogドライバーでも、デュアルロギングで docker logs が使える
  • 一部のコンテナだけ変えるときは --log-driver・--log-opt、Composeでは logging で指定する

関連記事

お気軽にご相談ください

お見積りへ お問い合わせへ
▲