Bagaimana untuk mendapatkan log kontena menggunakan Golang? (kesilapan)

WBOY
Lepaskan: 2024-02-08 21:09:28
ke hadapan
527 orang telah melayarinya

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

editor php Xigua membawakan anda panduan praktikal tentang cara menggunakan Golang untuk mendapatkan log kontena. Dalam pembangunan aplikasi kontena, log adalah sangat penting, kerana ia boleh membantu kami mencari dan menyelesaikan masalah dengan cepat. Artikel ini akan memperkenalkan cara menggunakan Golang untuk menulis kod, mendapatkan maklumat log bekas melalui API Docker dan mengendalikan ralat biasa. Sama ada anda seorang pemula atau pembangun yang berpengalaman, artikel ini akan memberikan anda petua berguna dan kod contoh untuk membantu anda menggunakan Golang dengan lebih baik untuk mendapatkan log kontena. Mari mulakan!

Kandungan soalan


Saya cuba menulis perisian pemantauan docker menggunakan golang.

Kod saya kelihatan seperti ini:

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)
}
Salin selepas log masuk

Masalahnya ialah pelaksanaan kod di atas berhenti pada pernyataan fmt.println(buf.readfrom(out)). Kod itu pernah berfungsi, tetapi tiba-tiba ia tidak berfungsi lagi. Ia sama ada berhenti tanpa ralat atau mengembalikan rentetan kosong.

Pelanggan yang saya cuba kumpulkan log juga ditulis oleh saya sendiri dan kelihatan seperti ini:

package main

import (
    "log"
    "time"
)

func main() {
    for i := 0; i > -1; i++ {
        log.Output(1, "Hello World logged!")
        time.Sleep(time.Minute)
    }
}
Salin selepas log masuk

Saya telah mencuba menyahpepijat dan memeriksa pembolehubah tetapi saya tidak dapat mencari punca masalahnya.


Penyelesaian


Saya benar-benar tidak pasti kerana saya tidak mempunyai sebarang log ralat untuk mengesahkan andaian saya. Walau bagaimanapun, apabila containerlogs mengembalikan aliran (io.readcloser), adakah mungkin aliran itu sendiri belum ditutup?

Jika boleh, bolehkah anda melakukan percubaan terlebih dahulu untuk menguji teori ini dengan menambahkan tamat masa dan mencatatnya selepas setiap tempoh kecil?

Salah satu cara yang boleh dilakukan ialah

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)
    }
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk mendapatkan log kontena menggunakan Golang? (kesilapan). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!