Supervisord: возможно ли перенаправить подпроцесс stdout обратно в супервизор?

Я использую supervisord как точку входа для контейнеров Docker, как описано в https://docs.docker.com/articles/using_supervisord/, Я хочу, чтобы все журналы были записаны в stdout, поэтому я могу использовать встроенные инструменты, такие как docker logs или журнал systemd, особенно если вы запускаете контейнеры в CoreOS.

для опции stderr there redirect_stderr=true для подпроцессов, возможно ли перенаправить подпроцесс stdout обратно в супервизор как-то и не обрабатывать фактические файлы журналов?

Ответ 1

Вы можете перенаправить программу stdout на супервизор stdout, используя следующие параметры конфигурации:

stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0

Пояснение:

  • Когда процесс открывается /dev/fd/1 (что совпадает с /proc/self/fd/1), система фактически клонирует дескриптор файла 1 (stdout) этого процесса. Поэтому использование stdout_logfile приводит к тому, что supervisord перенаправляет программу stdout на собственный stdout.
  • stdout_logfile_maxbytes=0 отключает вращение файла журнала, что явно не имеет смысла для stdout. Не указывая эту опцию, это приведет к ошибке, поскольку значение по умолчанию составляет 50 МБ, а супервизор недостаточно умен, чтобы обнаружить, что указанный файл журнала не является обычным файлом.

Для получения дополнительной информации:

http://veithen.github.io/2015/01/08/supervisord-redirecting-stdout.html