[英]How to stream Docker container logs via the Go SDK
我在Go中為某些游戲服務器軟件編寫了一個名為sampctl的工具 ,其主要功能是為服務器實例啟動一個Docker容器,然后捕獲從容器中出來的日志,對其進行清理,然后將其發送到用戶選擇的位置,例如Elasticsearch或管理面板,以供以后分析。
我已經完成了所有其他工作,似乎無法工作的唯一一件事就是流日志。 如果容器中的應用程序崩潰,我可以獲取日志,但是我想實時傳輸日志。
我試過使用帶有ContainerLogs
返回的ReadCloser
的掃描儀,但是它只是掛在終端上。
ContainerLogs
是否甚至支持流傳輸? 還是我需要找出另一個解決方案...
抱歉,如果這不是Go問題而不是Docker問題,我不太確定是否要在此處發布或在GoLangBridge上發布...
你看過文檔嗎? 流中嵌入了元數據,因此您不能僅將其通過管道傳輸到控制台。
我在監視應用程序中具有以下代碼:
i, err := cli.ContainerLogs(context.Background(), cid, types.ContainerLogsOptions{
ShowStderr: true,
ShowStdout: true,
Timestamps: false,
Follow: true,
Tail: "40",
})
if err != nil {
log.Fatal(err)
}
hdr := make([]byte, 8)
for {
_, err := i.Read(hdr)
if err != nil {
log.Fatal(err)
}
var w io.Writer
switch hdr[0] {
case 1:
w = os.Stdout
default:
w = os.Stderr
}
count := binary.BigEndian.Uint32(hdr[4:])
dat := make([]byte, count)
_, err = i.Read(dat)
fmt.Fprint(w, string(dat))
}
只要我保持運行它就會流。 還有一個幫助程序包可以為您完成大多數操作,但就我而言,由於其他原因,我需要像這樣單獨處理消息。
好的,我設法解決了這個問題,我不確定為什么captncraig的答案不起作用,我仍然對此感到好奇,但是,這是我的解決方案:
我必須在ContainerCreate
調用中設置其他一些選項:
Tty: true,
AttachStdout: true,
AttachStderr: true,
然后, scanner.Scan()
方法運行良好!
這是更新的代碼: https : //github.com/Southclaws/sampctl/blob/1ad7971d817031bd5a5b3acfad3bf2ea69232c98/run_container.go#L56-L70
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.