Dockerではsupervisordを使ってプロセス管理をする事が多いですね。
そのようなコンテナでは、以下のコマンドでsupervisord
が吐いたログを確認できます:
docker logs -f <container_id>
さらに、子プロセスが吐いたstdout/stderrを同様に確認したくなることがあります。
例えばmysql
やapache2
のログなどです。
いちいちコンテナにログインして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_logfile
とstderr_logfile
にログファイルへのパスを指定することでリダイレクトさせています。
例えばプロセスのstdoutをリダイレクトさせたい時は以下のように記述します:
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stdout_logfile_maxbytes=0
はログファイルのローテーションを無効にしています。もし指定しなければ以下のようなエラーが出ます:
[Errno 29] Illegal seek
参考になれば幸いです。