カテゴリー
Linux

Supervisor を Docker で使用しているとき、ログを標準出力して Docker ログに出力できるようにする

Docker イメージ php:7.4.5-apache で Apache の他に cron も動かす方法 – oki2a24 のcrond の実行ログを docker のログに出力するようにしたと思ったが出力されていない、という問題に対処できました。

ポイント

  • 対象のプロセスのログを stdout や stderr へ出力しておくことが必要
  • Supervisor の対象プロセスの設定で、ログを stdout や stderr へ出力するように設定
  • どちらか一方ではダメで、対象プロセス自身のログと Supervisor の対象プロセスの設定の両方で stdout や stderr へ出力すること

実装例

apache2 のログ設定

root@cfdeacc0c370:/var/www/html# ls -al /var/log/apache2/
total 12
drwxrwxrwx 2 www-data www-data 4096 Jun  9 13:43 .
drwxr-xr-x 1 root     root     4096 Aug 12 13:32 ..
lrwxrwxrwx 1 www-data www-data   11 Jun  9 13:43 access.log -> /dev/stdout
lrwxrwxrwx 1 www-data www-data   11 Jun  9 13:43 error.log -> /dev/stderr
lrwxrwxrwx 1 www-data www-data   11 Jun  9 13:43 other_vhosts_access.log -> /dev/stdout
root@cfdeacc0c370:/var/www/html#

crond のログ設定

root@cfdeacc0c370:/var/www/html# ls -al /var/log/cron
lrwxrwxrwx 1 root root 11 Aug 12 13:32 /var/log/cron -> /dev/stdout
root@cfdeacc0c370:/var/www/html#

docker/supervisord.conf

diff --git a/docker/supervisord.conf b/docker/supervisord.conf
index a8662f9..a867092 100644
--- a/docker/supervisord.conf
+++ b/docker/supervisord.conf
@@ -3,6 +3,14 @@ nodaemon=true

 [program:apache2]
 command=/usr/local/bin/apache2-foreground
+stdout_logfile=/dev/stdout
+stdout_logfile_maxbytes=0
+stderr_logfile=/dev/stderr
+stderr_logfile_maxbytes=0

 [program:crond]
 command=/bin/busybox crond -f -L /var/log/cron
+stdout_logfile=/dev/stdout
+stdout_logfile_maxbytes=0
+stderr_logfile=/dev/stderr
+stderr_logfile_maxbytes=0

補足

Laravel のログを stderr へも出力するようにしております。

これによって、 Laravel のログも Docker ログへと出力されていることを確認できました。

おそらく、 Apache で PHP を動かしていますので、 Apache のログとして扱われているのでは無いかと考えております。

調べたこと

残っている問題

  • Laravel の Artisan コンソールコマンドから出力したログが、 Docker ログに出力されません。例えばウェブブラウザからコントローラーへアクセスした時のロジックでのログ出力は想定通り Docker ログへと出力されますのに。

おわりに

Docker ログへと出力されなくなってしまったのは痛手と感じておりましたので、 Docker イメージ php:7.4.5-apache で Apache の他に cron も動かす方法 – oki2a24 から前進できたことを非常に嬉しいです。

あとひとつ、問題が解決できればと思います。

以上です。

コメントを残す