Maison >développement back-end >Golang >Comment rediriger simultanément la sortie de la commande vers la console et le fichier journal en temps réel ?

Comment rediriger simultanément la sortie de la commande vers la console et le fichier journal en temps réel ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-04 07:42:02585parcourir

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

Comment rediriger simultanément la sortie d'une commande vers la console et le fichier journal en temps réel

Le code fourni imprime la sortie standard et le stderr d'une commande sur la console mais n'a pas la possibilité de l'enregistrer dans un fichier en temps réel. Cet article présente une solution utilisant MultiWriter pour obtenir une journalisation et une sortie console simultanées tout en respectant les critères suivants :

  • Sortie en temps réel vers la console
  • Réplication exacte de la sortie dans le fichier journal
  • Respect de l'ordre d'écriture
  • Aucune modification de la commande exécutée

Les tentatives précédentes utilisant des scanners, io.Copy et d'autres techniques n'ont pas réussi à maintenir l'ordre de sortie en raison de conditions de concurrence potentielles entre les goroutines.

Solution : Utilisation de MultiWriter

La solution exploite le type io.MultiWriter, qui permet d'écrire vers plusieurs destinations simultanément. Voici le code révisé :

<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>

L'instance mwriter de MultiWriter combine le fichier journal et la sortie standard. Lorsque vous spécifiez Stdout et Stderr pour la commande, utilisez mwriter pour vous assurer que la sortie de la console et la journalisation se produisent simultanément.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn