Регистрация от детей супервизорного подпроцесса

Моя система состоит из приложения Python, которое запускается из supervisord. Давайте назовем это A, A запускает подпроцесс B сделать часть своей задачи. И то и другое A а также B закодированы в Python и используют стандарт logging модуль для вывода сообщений на консоль.

stdout а также stderr из A записываются в файл, указанный в конфигурации супервизора. Это работает как шарм. Теперь я хотел бы туннель stdout а также stderr от B в тот же файл, что и в A, Как этого достичь?

2 ответа

Решение

Вам не нужно ничего делать. B наследуется AСтандартные потоки по умолчанию.

Если стандартный вывод A перенаправлен в файл, то Bs stout автоматически записывает в то же место.

Модуль подпроцесса Python предоставляет средства для чтения дочерних элементов stdout и stderr. Вы можете захватить их и отправить их в свой логгер. Ниже приведена версия после выполнения, которая отправляет весь вывод в журналы после завершения дочернего процесса. Это можно сделать также построчно, и вы можете найти примеры, читающие стандартный вывод подпроцесса в Stackru.

  worker = subprocess.Popen(cmdline, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  worker.wait()
  logger.debug("Subprocess %s stdout: %s", cmdline, worker.stdout.read().decode("utf-8"))
Другие вопросы по тегам