晴耕雨読

working in the fields on fine days and reading books on rainy days

[Docker] docker-composeでログ出力先をsyslogにする

Docker composeでコンテナのログをsyslogに転送するための設定について説明します。

syslogの設定

まず、rsyslogの設定に Docker 固有のログ転送設定を追加します。 設定ファイルは /etc/rsyslog.d/docker.conf に作成します。

$ sudo vi /etc/rsyslog.d/docker.conf

syslog のテンプレート ($template) は、出力先や出力メッセージの形式をカスタマイズできる機能です。 テンプレート形式が文字列1個のときは、それは出力先パスとなります。 そして、if文でファシリティ(ログの種類)が「daemon」、ログ生成元のプログラム名に「docker-」が含まれているとき、そのログをテンプレートで定義した DockerLogs へ転送します。

/etc/rsyslog.d/docker.conf

$template DockerLogs, "/var/log/docker/docker-%programname%.log"
if $syslogfacility-text == 'daemon' and $programname contains 'docker-' then {
  -?DockerLogs
}
& stop

syslogの設定が終わったら、デーモンを再起動しておきます。

$ sudo systemctl restart rsyslog

docker-composeの設定

続いて、docker-compose側の設定をしていきます。 任意のディレクトリの中に docker-compose.yml を作成します。

$ cd rsyslog-test
$ vi docker-compose.yml

ここではサンプルとして、2秒ごとにログを出力するコンテナを作成し、そのログ出力を syslog にするという設定を行います。 logging.driver に「syslog」、logging.options にログ出力時のファシリティ名とタグ名をsyslogの設定に合わせて指定します。

docker-compose.yml

services:
    sample:
        build:
            context: sample
            dockerfile: Dockerfile
        logging:
            driver: syslog
            options:
                syslog-facility: daemon
                tag: docker-{{.Name}}

次に、2秒ごとにログを出力するサンプル用のコンテナを作成します。

$ mkdir sample
$ vi sample/Dockerfile

そして、Dockerfileにはコンテナがログを出力し続けるように、次のコマンドを記載しておきます。

Dockerfile

FROM alpine

ENTRYPOINT ["/bin/sh", "-c", "while :; do echo 'Hello from Docker Container!'; sleep 2; done"]

ここまでできたら、docker-compose からコンテナを起動します。

$ docker compose up -d
[+] Running 2/2
 ✔ Network syslog-test_default     Created
 ✔ Container syslog-test-sample-1  Started

起動すると syslog を経由してログファイルにログが書き込まれることが確認できます。

$ tail -f /var/log/docker/docker-docker-syslog-test-sample-1.log
Aug  5 13:08:02 dockerserver docker-syslog-test-sample-1[1022]: Hello from Docker Container!
Aug  5 13:08:04 dockerserver docker-syslog-test-sample-1[1022]: Hello from Docker Container!
Aug  5 13:11:14 dockerserver docker-syslog-test-sample-1[1022]: message repeated 95 times: [ Hello from Docker Container!]

以上です。

参考資料