如何將指令輸出同時即時重新導向到控制台和日誌檔案
提供的程式碼將指令的stdout 和stderr 印到控制台,但缺乏將其實時記錄到文件的能力。本文提出了一種使用 MultiWriter實現同步日誌記錄和控制台輸出的解決方案,同時遵循以下條件:
之前使用掃描器、io.Copy和其他技術的嘗試未能維持輸出的順序由於 goroutine 之間存在潛在的競爭條件。
解決方案:使用 MultiWriter
此解決方案利用 io.MultiWriter 類型,它允許同時寫入多個目標。以下是修改後的程式碼:
<code class="go">package main import ( "io" "log" "os" "os/exec" ) func main() { // Logging capability f, err := os.OpenFile("log.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) if err != nil { log.Fatalf("Error opening file: %v", err) } defer f.Close() mwriter := io.MultiWriter(f, os.Stdout) cmd := exec.Command("ls") cmd.Stderr = mwriter cmd.Stdout = mwriter err = cmd.Run() //blocks until sub process is complete if err != nil { panic(err) } }</code>
MultiWriter 實例 mwriter 結合了日誌檔案和標準輸出。當為指令指定 Stdout 和 Stderr 時,使用 mwriter 確保控制台輸出和日誌記錄同時發生。
以上是如何將命令輸出同時即時重定向到控制台和日誌檔案?的詳細內容。更多資訊請關注PHP中文網其他相關文章!