Я использую супервизор в образах докеров, когда мне нужно запускать несколько служб в одном образе, например. postfix и другие почтовые сервисы. Когда я перенаправляю stdout / stderr из всех служб в супервизор, а супервизор также регистрирует в stdout / stderr, я бы предпочел иметь префикс / метку перед фактическим выводом журнала на консоли, чтобы знать, какой журнал исходит из какой службы. Я не могу найти никаких настроек конфигурации для этого, но, возможно, вы знаете способ.
Вот пример того, как это выглядит с Foreman:
@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 "$@"
Недавно у меня была такая же проблема, и я не мог понять supervisor-stdout
. Вот что я сделал:
В bash вы можете использовать Перенаправление ввода / вывода и Замена процесса трубить 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
и в качестве команды используйте сценарий bash, который настраивает перенаправление ввода-вывода.