2016-01-07 48 views
0

我的系統由從supervisord啓動的python應用程序組成。我們稱之爲AA啓動子流程B來完成其某些任務。 AB都使用Python編碼,並使用標準的logging模塊將消息輸出到控制檯。從supervisord子進程的子進程登錄

stdoutstderrA記錄到在supervisord配置中指定的文件中。這像一個魅力。現在,我想將stdoutstderrB轉換爲與A中相同的文件。這怎麼能實現?

+0

聽起來你應該可以使用相同的代碼來記錄'B',就像你在'A'中使用的一樣。你能告訴我們你的代碼嗎? – fredrik

回答

1

你不需要做任何事情。 B默認繼承A的標準流。

如果A的stdout被重定向到一個文件,那麼B的stdout會自動寫入同一個地方。

0

Python子流程模塊提供了讀取兒童標準輸出和標準錯誤的功能。您可以捕獲它們並將它們發送到您的記錄器。下面是一個執行後的版本,它在孩子完成後將所有輸出發送到日誌。也可以逐行執行此操作,並且您可以在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

謝謝你讓我朝着正確的方向前進。我想知道是否沒有辦法以某種魔術的方式設置日誌記錄模塊,以繞過可能對B的stdout/stderr所做的任何處理並直接轉儲到日誌文件中。 –

+0

downvote。除非從管道讀取,否則不要使用'stdout = PIPE',否則當子進程填充到其OS輸出管道緩衝區時,子進程可能會掛起(對於您的情況,子進程可能掛起,而父進程被阻塞在'worker.wait() ' - 死鎖)。 – jfs