Beim Ausführen eines Befehls mit der exec.Command-Funktion ist es oft wünschenswert, die Ausgabe in ein Protokoll umzuleiten, damit Zeitüberwachung. CombinedOutput kann zwar die gesamte Ausgabe erfassen, sobald der Befehl abgeschlossen ist, eignet sich jedoch nicht für Prozesse mit langer Laufzeit oder nicht abgeschlossenen Prozessen.
Eine gängige Lösung für die Ausgabeumleitung in Echtzeit besteht darin, stdout und stderr direkt den Systemausgabestreams zuzuweisen (os.Stdout und os.Stderr). Dies ist jedoch möglicherweise nicht praktikabel für Anwendungen, die nicht in ein Terminal schreiben.
Lösung mit Pipes
Um die Befehlsausgabe in ein Protokoll umzuleiten, können Sie Pipes verwenden . Hier ist ein Beispiel:
stdout, err := cmd.StdoutPipe() if err != nil { return nil, err } // Start the command with the pipe in place if err := cmd.Start(); err != nil { return nil, err } // Real-time monitoring of stdout in := bufio.NewScanner(stdout) for in.Scan() { log.Printf(in.Text()) // Write line to log or perform other operations } if err := in.Err(); err != nil { log.Printf("Error: %s", err) }
Überlegungen
Diese Methode verarbeitet stdout, aber Sie können stderr auch verwalten, indem Sie eine separate Pipe und Goroutine erstellen. Darüber hinaus müssen Sie möglicherweise die Kontextaufhebung oder andere Grenzfälle bewältigen, um eine ordnungsgemäße Bereinigung und Ressourcenverwaltung sicherzustellen.
Das obige ist der detaillierte Inhalt vonWie leite ich die Befehlsausgabe in Echtzeit in Golang in ein Protokoll um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!