2016-09-29 144 views
0

我想將stderr重定向到文件AND和stdoutgo - 將stderr重定向到文件並輸出到標準輸出

我知道如何重定向stderr使用dup2到文件:
err := syscall.Dup2(int(fatal_logfile.Fd()), int(os.Stderr.Fd()))

但是當時我沒有看到這個其他時間如何重定向到stdout。就像將一個流源複製到兩個不同的流中一樣。

注意,當應用程序啓動並用於重定向stderr時,會調用此功能,例如發生panic時。然後我不能在這種情況下使用recover(即使因爲我正在運行大量goroutines)。

任何人有一個想法如何解決這個問題?


另一個工作溶液是調用二進制時使用pipestee,但可以具有在應用程序中所定義的相同的行爲/邏輯?我希望它以默認的方式運行。

./app_bin 2> >(tee -a fatal.log)

無論它寫入 writer將寫入 os.Stdoutos.Stderr
+0

我認爲在應用程序之外處理這個可能會更好,根據需要重定向stderr。你可以用一些管道和副本來做到這一點,但是你現在有機會失去stderr輸出,而不是有一個單獨的非緩衝流。 – JimB

+0

正確@JimB - 我剛剛更新了我的問題,包括運行二進制文件時重定向'stderr'的問題。可能是一個天真的問題,但我可以在應用程序中「導入」相同的邏輯嗎?我希望它以默認的方式運行 – damoiser

+0

在程序之外執行此操作總是更加可靠。如果目標是在發生崩潰時捕獲輸出,那麼在程序退出之前,執行程序中的「tee」功能可能無法獲取數據。 – JimB

回答

-1
writer := io.MultiWriter(os.Stdout, os.Stderr) 

+0

爲什麼是負1.這似乎是一個可行的解決方案? – reticentroot

+0

問題是要求將stderr寫入重定向並複製到os.File和os.Stdout。這創建了一個單獨的io.Writer,它將輸出發送到os.Stdout和os.Stderr,但根本不會重定向os.Stderr。 – JimB

+0

感謝您的解決方案cd1,但@JimB有權利。 – damoiser

相關問題