1つのイメージで複数のサービスを実行する必要がある場合、Dockerイメージでスーパーバイザーを使用しています。接尾辞およびその他のメールサービス。 stdout/stderrをすべてのサービスからスーパーバイザーにリダイレクトし、スーパーバイザーもstdout/stderrにログを記録する場合、コンソールの実際のログ出力の前にプレフィックス/ラベルを付けて、どのログがどのサービスからのものかを確認したいと思います。このための構成設定が見つかりませんが、方法を知っているかもしれません。
私は最近同じ問題を抱えていて、supervisor-stdout
を理解できませんでした。これが私がしたことです:
Bashでは、 I/Oリダイレクト および プロセス置換 を使用して、stdout
、stderr
を別のプロセスにパイプできます。
#!/usr/bin/env bash
# setup fd-3 to point to the original stdout
exec 3>&1
# setup fd-4 to point to the original stderr
exec 4>&2
# get the prefix from SUPERVISOR_PROCESS_NAME environement variable
printf -v PREFIX "%-10.10s" ${SUPERVISOR_PROCESS_NAME}
# reassign stdout and stderr to a preprocessed and redirected to the original stdout/stderr (3 and 4) we have create eralier
exec 1> >( Perl -ne '$| = 1; print "'"${PREFIX}"' | $_"' >&3)
exec 2> >( Perl -ne '$| = 1; print "'"${PREFIX}"' | $_"' >&4)
# from here on everthing that outputs to stdout/stderr will be go through the Perl script
echo "I will be prefixed"
# don't forget to use exec
これで、ロギングにstdoutとstderrを使用するようにスーパーバイザーをセットアップできます。
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
コマンドとして、I/Oリダイレクトを設定するbashスクリプトを使用します。
@flocki素晴らしい答えをありがとう!もう少し完全な例の下に:
[program:nginx]
command=/usr/local/bin/prefix-log /usr/sbin/nginx -g "daemon off; error_log /dev/stderr info;"
autostart=true
autorestart=true
priority=10
stdout_events_enabled=true
stderr_events_enabled=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
stopsignal=QUIT
プレフィックスログ:
#!/usr/bin/env bash
# setup fd-3 to point to the original stdout
exec 3>&1
# setup fd-4 to point to the original stderr
exec 4>&2
# get the prefix from SUPERVISOR_PROCESS_NAME environement variable
printf -v PREFIX "%-10.10s" ${SUPERVISOR_PROCESS_NAME}
# reassign stdout and stderr to a preprocessed and redirected to the original stdout/stderr (3 and 4) we have create eralier
exec 1> >( Perl -ne '$| = 1; print "'"${PREFIX}"' | $_"' >&3)
exec 2> >( Perl -ne '$| = 1; print "'"${PREFIX}"' | $_"' >&4)
# from here on everthing that outputs to stdout/stderr will be go through the Perl script
exec "$@"