首頁  >  文章  >  後端開發  >  如何將命令輸出同時即時重定向到控制台和日誌檔案?

如何將命令輸出同時即時重定向到控制台和日誌檔案?

Linda Hamilton
Linda Hamilton原創
2024-11-04 07:42:02532瀏覽

How to Redirect Command Output to Console and Log File Simultaneously in Real Time?

如何將指令輸出同時即時重新導向到控制台和日誌檔案

提供的程式碼將指令的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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn