Dockerで子プロセスからのstdoutをsupervisordにリダイレクトする方法

Dockerではsupervisordを使ってプロセス管理をする事が多いですね。
そのようなコンテナでは、以下のコマンドでsupervisordが吐いたログを確認できます:

docker logs -f <container_id>

さらに、子プロセスが吐いたstdout/stderrを同様に確認したくなることがあります。
例えばmysqlapache2のログなどです。
いちいちコンテナにログインしてtail -fなんてやってられませんよね。
supervisord.confを以下のように設定すれば、これら子プロセスのログをsupervisordに転送できます:

[supervisord]
nodaemon=true

[program:mysql]
command=/usr/bin/pidproxy /var/run/mysqld/mysqld.pid /usr/sbin/mysqld
autorestart=true
stderr_logfile=/var/log/mysql/error.log
stderr_logfile_maxbytes=0

[program:apache2]
command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND"
autorestart=true
stdout_logfile=/var/log/apache2/access.log
stdout_logfile_maxbytes=0
stderr_logfile=/var/log/apache2/error.log
stderr_logfile_maxbytes=0

このように、stdout_logfilestderr_logfileにログファイルへのパスを指定することでリダイレクトさせています。
例えばプロセスのstdoutをリダイレクトさせたい時は以下のように記述します:

stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0

stdout_logfile_maxbytes=0 はログファイルのローテーションを無効にしています。もし指定しなければ以下のようなエラーが出ます:

[Errno 29] Illegal seek

参考になれば幸いです。

参考リンク

投稿者:

Takuya

Digital crafts(man|dog). Love photography. Always making otherwise sleeping. born in 1984.

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中