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

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

Snap是針對Linux系統設計的外部套件管理器,它為您提供了安裝容器化應用程式的便捷途徑。透過Snap,您可以輕鬆下載和安裝軟體包,無需擔心安裝額外的依賴項。此管理器會自動解決軟體包所需的依賴項,確保軟體包能夠在您的系統上順利運作。 Snap與本地的apt套件管理器相輔相成,為您提供了另一種在系統中安裝和運行應用程式的選擇。在本指南中,您將找到有關如何在Debian12上安裝Snap的完整指南。提綱:如何在Debian12上安裝Snap如何在Snap上尋找包可用性如何在Snap上找到有關包的信

我正在嘗試調試docker-compose,即這個Go文件,以解決某些問題(這個)。為此,我設定了一個GoLang調試器gorunmain.go-f/.../project_root/docker-compose.yml-f/.../project_root/folder1/docker-compose.ymlconfig的輸出符合預期,合併的配置文件.由於某種原因,我找不到代碼中設置的配置文件,儘管它們必須設置在某個地方,因為輸出是正確合併的配置文件。我懷疑它們一定就設置

PyCharm 支援的程式語言包括:Python(主要支援語言)JavaScript(包括 Node.js 和 React)HTML/CSSTypeScriptJavaC/C++GoSQLDockerKotlinRust

在現今科技快速發展的時代,程式語言也如雨後春筍般湧現。其中一門備受矚目的語言就是Go語言,它以其簡潔、高效、並發安全等特性受到了許多開發者的喜愛。 Go語言以其強大的生態系統而著稱,其中有許多優秀的開源專案。本文將介紹五個精選的Go語言開源項目,帶領讀者一起探索Go語言開源專案的世界。 KubernetesKubernetes是一個開源的容器編排引擎,用於自

身為一個網路工程師,在考慮為工作安裝Linux時,你可能會面臨一個問題:在成千上萬個可用的Linux發行版中,應該選擇哪一個呢?不用擔心,你並不是孤單的。 Linux作為網路工程師的常見首選作業系統,有許多發行版適合與網路相關的任務。如果你是網路工程師,你可能會想要知道哪些發行版在工作中提供了最佳的功能。以下是六個被網路工程師廣泛推薦的優秀Linux發行版:1、Fedora在眾多Linux發行版中,Fedora是網路工程師中最受推崇的之一,原因很簡單。 Fedora是個開源發行版,相當於紅帽企

Go語言應用於以下領域:後端開發(微服務、分散式系統)雲端運算(雲端原生應用程式、容器化應用)資料處理(資料分析、大數據引擎)網路和分散式系統(代理伺服器、分佈式快取)系統工具(作業系統、實用程式)

在快節奏的軟體開發環境中,快速發布版本至關重要。 CI/CD(持續整合和持續部署)管道可以自動化部署流程,簡化程式碼從開發到生產的轉移。本文重點介紹如何在 Kubernetes 環境中使用 Jenkins、Helm 和 Kubernetes 設定完全自動化的 CI/CD 管道,包括:環境設定、自動化管道建置和部署到開發、登台和生產環境的步驟。透過實施此自動化流程,開發人員可以專注於程式碼開發,同時將複雜的基礎設施管理留給自動化,從而提高部署效率和可靠性。

Linux在雲端運算領域的廣泛應用隨著雲端運算技術的不斷發展和普及,Linux作為一種開源作業系統在雲端運算領域中發揮重要作用。由於其穩定性、安全性和靈活性,Linux系統被廣泛應用於各種雲端運算平台和服務中,為雲端運算技術的發展提供了堅實的基礎。本文將介紹Linux在雲端運算領域的廣泛應用,並給出具體的程式碼範例。一、Linux在雲端運算平台中的應用虛擬化技術虛擬化技術
