簡體   English   中英

如何通過Go SDK流式傳輸Docker容器日志

[英]How to stream Docker container logs via the Go SDK

我在Go中為某些游戲服務器軟件編寫了一個名為sampctl的工具 ,其主要功能是為服務器實例啟動一個Docker容器,然后捕獲從容器中出來的日志,對其進行清理,然后將其發送到用戶選擇的位置,例如Elasticsearch或管理面板,以供以后分析。

我已經完成了所有其他工作,似乎無法工作的唯一一件事就是日志。 如果容器中的應用程序崩潰,我可以獲取日志,但是我想實時傳輸日志。

我試過使用帶有ContainerLogs返回的ReadCloser的掃描儀,但是它只是掛在終端上。

https://github.com/Southclaws/sampctl/blob/9c76b4dd1b3dbb9e18927da10028d5beeb94f728/run_container.go#L64-L67

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM