So leiten Sie die Befehlsausgabe gleichzeitig in Echtzeit an die Konsole und die Protokolldatei um
Der bereitgestellte Code gibt die stdout und stderr eines Befehls aus Die Konsole verfügt jedoch nicht über die Möglichkeit, sie in Echtzeit in einer Datei zu protokollieren. In diesem Artikel wird eine Lösung mit MultiWriter vorgestellt, um eine gleichzeitige Protokollierung und Konsolenausgabe unter Einhaltung der folgenden Kriterien zu erreichen:
Frühere Versuche mit Scannern, io.Copy und anderen Techniken konnten die Ausgabereihenfolge nicht beibehalten aufgrund möglicher Wettlaufbedingungen zwischen Goroutinen.
Lösung: Verwendung von MultiWriter
Die Lösung nutzt den Typ io.MultiWriter, der das gleichzeitige Schreiben an mehrere Ziele ermöglicht. Hier ist der überarbeitete Code:
<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>
Der MultiWriter-Instanz-Mwriter kombiniert die Protokolldatei und die Standardausgabe. Wenn Sie Stdout und Stdderr für den Befehl angeben, verwenden Sie mwriter, um sicherzustellen, dass sowohl Konsolenausgabe als auch Protokollierung gleichzeitig erfolgen.
Das obige ist der detaillierte Inhalt vonWie leite ich die Befehlsausgabe gleichzeitig in Echtzeit an die Konsole und die Protokolldatei um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!