2016-01-07 2 views
0

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

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

+0

Похоже, что вы должны использовать тот же код для ведения журнала для 'B', как вы используете в' A'. Можете ли вы показать нам свой код? – fredrik

ответ

1

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

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

0

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

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")) 
+0

Спасибо, что загнал меня в правильном направлении. Мне было интересно, не будет ли какой-либо волшебный способ установить модуль регистрации, чтобы обойти любое обращение, которое вы можете делать в stdout/stderr из B, и сбрасывать непосредственно в файл журнала. –

+0

downvote. Не используйте 'stdout = PIPE', если вы не прочтете из трубы, иначе ребенок может висеть, как только он заполнит свой буфер буфера stdout OS (в вашем случае ребенок может зависать, когда родительский блок заблокирован на' worker.wait() '- тупик). – jfs

Смежные вопросы