首頁  >  文章  >  後端開發  >  如何使用 Golang 取得容器日誌? (錯誤)

如何使用 Golang 取得容器日誌? (錯誤)

WBOY
WBOY轉載
2024-02-08 21:09:28532瀏覽

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

php小編西瓜為你帶來如何使用Golang取得容器日誌的實用指南。在容器化應用開發中,日誌是非常重要的,它可以幫助我們快速定位和解決問題。本文將介紹如何使用Golang編寫程式碼,透過Docker API取得容器的日誌訊息,並對常見錯誤進行處理。無論你是新手還是有經驗的開發者,本文都將為你提供有用的技巧和範例程式碼,幫助你更好地利用Golang取得容器日誌。讓我們一起開始吧!

問題內容


我正在嘗試用 golang 寫 docker 監控軟體。

我的程式碼如下所示:

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

問題是上述程式碼的執行在 fmt.println(buf.readfrom(out)) 語句處停止。該程式碼曾經可以工作,但突然就不再工作了。它要么停止而沒有錯誤,要么返回一個空字串。

我嘗試收集日誌的客戶端也是我自己寫的,如下所示:

package main

import (
    "log"
    "time"
)

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

我已經嘗試過調試和檢查變量,但我就是無法找到問題的根源。


解決方法


我真的不確定,因為我沒有任何錯誤日誌來證實我的假設。 但是,當 containerlogs 傳回一個流(io.readcloser)時,是否可能該流本身尚未關閉?

如果有可能,您可以先進行一次試運行,透過新增超時並在每個小持續時間後記錄它來測試這個理論?

一種可能的方法是

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

以上是如何使用 Golang 取得容器日誌? (錯誤)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除