Table des matières
Contenu de la question
Solution de contournement
Maison développement back-end Golang Comment obtenir les journaux de conteneurs à l'aide de Golang ? (erreur)

Comment obtenir les journaux de conteneurs à l'aide de Golang ? (erreur)

Feb 08, 2024 pm 09:09 PM
容器化应用

如何使用 Golang 获取容器日志? (错误)

l'éditeur php Xigua vous propose un guide pratique sur la façon d'utiliser Golang pour obtenir les logs des conteneurs. Dans le développement d'applications conteneurisées, les journaux sont très importants, car ils peuvent nous aider à localiser et à résoudre rapidement les problèmes. Cet article explique comment utiliser Golang pour écrire du code, obtenir les informations de journal du conteneur via l'API Docker et gérer les erreurs courantes. Que vous soyez un débutant ou un développeur expérimenté, cet article vous fournira des conseils utiles et des exemples de code pour vous aider à mieux utiliser Golang pour obtenir les journaux de conteneurs. Commençons!

Contenu de la question


J'essaie d'écrire un logiciel de surveillance Docker en utilisant Golang.

Mon code ressemble à ceci :

package main

import (
    "bytes"
    "context"
    "fmt"
    "time"

    "github.com/docker/docker/api/types"
    "github.com/docker/docker/client"
)

func main() {
    ctx := context.background()

    cli, err := client.newclientwithopts(client.fromenv)
    if err != nil {
        panic(err)
    }

    containers, err := cli.containerlist(ctx, types.containerlistoptions{})
    if err != nil {
        panic(err)
    }

    for _, container := range containers {
        out, err := cli.containerlogs(ctx, container.id, types.containerlogsoptions{
            showstderr: true,
            showstdout: true,
            timestamps: false,
            follow:     true,
            tail:       "40"})

        if err != nil {
            panic(err)
        }

        fmt.println("the \"" + container.image + "\" container, with the id \"" + container.id + "\" logged: ")
        fmt.println()

        buf := new(bytes.buffer)

        fmt.println(buf.readfrom(out))

        fmt.println(buf.string())
    }
    time.sleep(time.second * 3)
}
Copier après la connexion

Le problème est que l'exécution du code ci-dessus s'arrête à l'instruction fmt.println(buf.readfrom(out)). Le code fonctionnait, mais du coup il ne fonctionne plus. Soit il s'arrête sans erreur, soit il renvoie une chaîne vide.

Le client dont j'essaie de collecter les journaux est également écrit par moi-même et ressemble à ceci :

package main

import (
    "log"
    "time"
)

func main() {
    for i := 0; i > -1; i++ {
        log.Output(1, "Hello World logged!")
        time.Sleep(time.Minute)
    }
}
Copier après la connexion

J'ai essayé de déboguer et d'inspecter les variables mais je n'arrive tout simplement pas à trouver la source du problème.


Solution de contournement


Je ne suis vraiment pas sûr car je n'ai aucun journal d'erreurs pour confirmer mon hypothèse. Cependant, lorsque containerslogs renvoie un flux (io.readcloser), est-il possible que le flux lui-même n'ait pas été fermé ?

Si possible, pourriez-vous d'abord faire un essai pour tester cette théorie en ajoutant un délai d'attente et en l'enregistrant après chaque petite durée ?

Une façon possible est

select {
case <-time.After(5 * time.Second):
    fmt.Println("Timeout exceeded while reading container logs")
case <-ctx.Done():
    fmt.Println("Context cancelled while reading container logs")
case b := <-out:
    if b != nil {
        buf.Write(b)
    }
}
Copier après la connexion

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 de ce site Web
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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Commandes de chat et comment les utiliser
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment installer Snap sur Debian 12 Comment installer Snap sur Debian 12 Mar 20, 2024 pm 08:51 PM

Snap est un gestionnaire de packages externe conçu pour les systèmes Linux qui vous offre un moyen pratique d'installer des applications conteneurisées. Snap vous permet de télécharger et d'installer facilement des packages sans vous soucier de l'installation de dépendances supplémentaires. Le gestionnaire résout automatiquement les dépendances requises par le package, garantissant ainsi le bon fonctionnement du package sur votre système. Snap complète le gestionnaire de packages natif apt, vous offrant une autre option pour installer et exécuter des applications sur votre système. Dans ce guide, vous trouverez un guide complet sur la façon d'installer Snap sur Debian12. Aperçu : Comment installer Snap sur Debian12 Comment trouver la disponibilité des paquets sur Snap Comment trouver des informations sur les paquets sur Snap

Comment déboguer Docker-Compose ? Où est défini le chemin de configuration ? Comment déboguer Docker-Compose ? Où est défini le chemin de configuration ? Feb 10, 2024 pm 12:48 PM

J'essaie de déboguer docker-compose, ce fichier Go, pour résoudre un problème (ceci). Pour ce faire, j'ai configuré un débogueur GoLang gorunmain.go-f/.../project_root/docker-compose.yml-f/.../project_root/folder1/docker-compose.ymlconfig. La sortie est comme prévu, configuration fusionnée Pour une raison quelconque, je ne trouve pas les fichiers de configuration définis dans le code, bien qu'ils doivent être définis quelque part car le résultat correspond aux fichiers de configuration correctement fusionnés. Je soupçonne qu'ils doivent être définis

Quelles langues pycharm prend-il en charge ? Quelles langues pycharm prend-il en charge ? Apr 18, 2024 am 10:57 AM

Les langages de programmation pris en charge par PyCharm incluent : Python (principal langage pris en charge) JavaScript (y compris Node.js et React) HTML/CSSTypeScriptJavaC/C++GoSQLDockerKotlinRust

Cinq projets open source sélectionnés en langage Go pour vous emmener explorer le monde de la technologie Cinq projets open source sélectionnés en langage Go pour vous emmener explorer le monde de la technologie Jan 30, 2024 am 09:08 AM

À l'ère actuelle de développement technologique rapide, les langages de programmation poussent comme des champignons après la pluie. L'un des langages qui a beaucoup retenu l'attention est le langage Go, apprécié par de nombreux développeurs pour sa simplicité, son efficacité, sa sécurité de concurrence et d'autres fonctionnalités. Le langage Go est connu pour son écosystème solide avec de nombreux excellents projets open source. Cet article présentera cinq projets open source sélectionnés en langage Go et amènera les lecteurs à explorer le monde des projets open source en langage Go. KubernetesKubernetes est un moteur d'orchestration de conteneurs open source pour l'automatisation

6 meilleures distributions Linux pour les ingénieurs réseau 6 meilleures distributions Linux pour les ingénieurs réseau Feb 05, 2024 pm 05:20 PM

En tant qu'ingénieur réseau, lorsque vous envisagez d'installer Linux pour votre travail, vous pourriez être confronté à une question : parmi les milliers de distributions Linux disponibles, laquelle devriez-vous choisir ? Ne vous inquiétez pas, vous n'êtes pas seul. Linux est un système d'exploitation de choix pour les ingénieurs réseau, et il existe de nombreuses distributions adaptées aux tâches liées au réseau. Si vous êtes ingénieur réseau, vous souhaiterez peut-être savoir quelles distributions offrent les meilleures fonctionnalités pour votre travail. Voici six excellentes distributions Linux largement recommandées par les ingénieurs réseau : 1. Fedora Parmi les nombreuses distributions Linux, Fedora est l'une des plus respectées parmi les ingénieurs réseau, et la raison est simple. Fedora est une distribution open source équivalente à Red Hat Enterprise

Quels sont les domaines d'application du développement du langage Go ? Quels sont les domaines d'application du développement du langage Go ? Apr 03, 2024 am 11:33 AM

Le langage Go est utilisé dans les domaines suivants : développement back-end (microservices, systèmes distribués) cloud computing (applications cloud natives, applications conteneurisées) traitement de données (analyse de données, moteurs big data) réseaux et systèmes distribués (serveurs proxy, cache de distribution) outils système (système d'exploitation, utilitaires)

Automatisez facilement votre pipeline CI/CD avec Kubernetes, Helm et Jenkins Automatisez facilement votre pipeline CI/CD avec Kubernetes, Helm et Jenkins Apr 02, 2024 pm 04:12 PM

Dans un environnement de développement logiciel en évolution rapide, des versions rapides sont essentielles. Les pipelines CI/CD (Intégration continue et déploiement continu) automatisent le processus de déploiement et simplifient le déplacement du code du développement à la production. Cet article se concentre sur la configuration d'un pipeline CI/CD entièrement automatisé à l'aide de Jenkins, Helm et Kubernetes dans un environnement Kubernetes, y compris : la configuration de l'environnement, les étapes d'automatisation des constructions de pipeline et le déploiement dans des environnements de développement, de transfert et de production. En mettant en œuvre ce processus automatisé, les développeurs peuvent se concentrer sur le développement du code tout en laissant la gestion complexe de l'infrastructure à l'automatisation, améliorant ainsi l'efficacité et la fiabilité du déploiement.

La large application de Linux dans le domaine du cloud computing La large application de Linux dans le domaine du cloud computing Mar 20, 2024 pm 04:51 PM

La large application de Linux dans le domaine du cloud computing Avec le développement et la vulgarisation continus de la technologie du cloud computing, Linux, en tant que système d'exploitation open source, joue un rôle important dans le domaine du cloud computing. En raison de leur stabilité, de leur sécurité et de leur flexibilité, les systèmes Linux sont largement utilisés dans diverses plates-formes et services de cloud computing, fournissant une base solide pour le développement de la technologie du cloud computing. Cet article présentera le large éventail d'applications de Linux dans le domaine du cloud computing et donnera des exemples de code spécifiques. 1. Technologie de virtualisation d'applications de Linux dans la plate-forme de cloud computing Technologie de virtualisation

See all articles