Heim  >  Artikel  >  Backend-Entwicklung  >  Wie leite ich die Befehlsausgabe gleichzeitig in Echtzeit an die Konsole und die Protokolldatei um?

Wie leite ich die Befehlsausgabe gleichzeitig in Echtzeit an die Konsole und die Protokolldatei um?

Linda Hamilton
Linda HamiltonOriginal
2024-11-04 07:42:02532Durchsuche

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

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:

  • Echtzeitausgabe an die Konsole
  • Exakte Replikation der Ausgabe in der Protokolldatei
  • Beachtung der Schreibreihenfolge
  • Keine Änderung des ausgeführten Befehls

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn