Maison  >  Article  >  développement back-end  >  Comment rediriger la sortie du processus externe vers les journaux dans Golang en temps réel ?

Comment rediriger la sortie du processus externe vers les journaux dans Golang en temps réel ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-06 13:38:03787parcourir

How Do I Redirect External Process Output to Logs in Golang in Real Time?

Redirection de la sortie du processus vers les journaux dans Golang

Lors de l'exécution de processus externes dans Golang, il peut être utile de capturer et d'enregistrer leur sortie rapidement. En attendant la fin du processus et en utilisant CombinedOutput() permettant la journalisation, cela n'est pas pratique pour les processus de longue durée ou inachevés.

Alternativement, écrire sur Stdout en temps réel est insuffisant pour les services qui ne génèrent pas de sortie vers une borne. Une solution consiste à exploiter les canaux pour une redirection efficace des sorties.

Utiliser les canaux pour la redirection

Un canal crée une connexion entre les processus, permettant le transfert de données. Pour rediriger la sortie du processus vers les journaux, suivez ces étapes :

  1. Création d'un canal : Créez un canal pour lire la sortie standard du processus à l'aide de StdoutPipe().
  2. Exécution du processus : Démarrez le processus avec le canal établi.
  3. Lecture de sortie : Lisez la sortie du canal Stdout ligne par ligne à l'aide d'un scanner tamponné.
  4. Journalisation : Écrivez chaque ligne dans le journal souhaité en utilisant log.Printf().

L'ajout d'un gestionnaire pour Stderr peut être réalisé en créant une goroutine pour la gestion simultanée des deux canaux de sortie .

Exemple de mise en œuvre :

Considérez l'extrait de code suivant utilisant des canaux pour la redirection de sortie :

stdout, err := cmd.StdoutPipe()
if err != nil {
    return 0, err
}

if err := cmd.Start(); err != nil {
    return 0, err
}

in := bufio.NewScanner(stdout)

for in.Scan() {
    log.Printf(in.Text())
}
if err := in.Err(); err != nil {
    log.Printf("error: %s", err)
}

En employant cette approche, vous pouvez efficacement capturer et enregistrer les résultats des processus externes en temps opportun, garantissant ainsi que des informations précieuses sont disponibles pour le débogage et l'analyse.

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