如果我用iex
啓動我的應用程序,我會在控制檯上看到我的應用程序的日誌語句。如何重新陷入節點並捕獲它的I/O,就好像以iex開始一樣?
如果我啓動我的應用程序分離,然後remsh
進入它,我怎麼能看到相同的輸出。
如果我用iex
啓動我的應用程序,我會在控制檯上看到我的應用程序的日誌語句。如何重新陷入節點並捕獲它的I/O,就好像以iex開始一樣?
如果我啓動我的應用程序分離,然後remsh
進入它,我怎麼能看到相同的輸出。
默認情況下,您從遠程shell執行的任何操作都會將其組頭設置爲shell的組長,因此I/O將按預期工作。
對於從主節點啓動的進程,它們的組長已經被設置,所以他們的I/O將不會被重定向到遠程shell。您可以使用Process.group_leader/2
來設置進程的組長,例如:Process.group_leader(pid, Process.group_leader())
,它將設置組長爲pid
爲當前進程的組長。您可以配置Logger的:console
後端也可以使用Logger.configure_backend(:console, [device: Process.group_leader()])
重定向到您的shell。之後,所有的控制檯記錄器輸出應該被定向到遠程shell。
請謹慎操作。如果您在一個會產生大量輸出的應用程序上執行此操作,那麼您可能會出現超負荷組長的風險,這可能會導致其崩潰,並因此嘗試寫入它的任何內容 - 並且在您在遠程節點上分配組長。我建議只在實驗時或者在開發過程中這樣做。在生產中,無論如何你都應該把日誌寫入文件中,而通過ssh被動地尾尾處理這些日誌要比將記錄器的組長改爲遠程shell更安全 - 特別是如果你在不改變組長的情況下殺死你的shell背部;這將導致任何試圖寫入組長的進程崩潰。在更改過程之前,您還需要小心保存過程的組長,以便確保將其更改回正確的過程。
啊,那裏有一些很棒的音符,我沒有想到。 –