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で指定する