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中文網其他相關文章!