1 回答

TA貢獻(xiàn)1934條經(jīng)驗(yàn) 獲得超2個贊
我找到了問題的答案。
所以 docker 在 io.ReadCloser 中吐出日志輸出,該輸出可以寫入 bytes.Buffer:
var stdout bytes.Buffer
var stderr bytes.Buffer
containerLog := GetLogs(containerID)
stdcopy.StdCopy(&stdout, &stderr, containerLog)
無論如何,這是代碼GetLogs:
// GetLogs return logs from the container io.ReadCloser. It's the caller duty
// duty to do a stdcopy.StdCopy. Any other method might render unknown
// unicode character as log output has both stdout and stderr. That starting
// has info if that line is stderr or stdout.
func GetLogs(contName string) (logOutput io.ReadCloser) {
options := types.ContainerLogsOptions{ShowStdout: true, ShowStderr: true}
out, err := dc.ContainerLogs(ctx, contName, options)
if err != nil {
panic(err)
}
return out
}
在將其發(fā)送到接受字符串的 GitHub API 之前,我們可以去掉\r一行中最后一個之前的所有內(nèi)容:
// cleanFlushInfo takes in bytes.Buffer from docker logs output and for each line
// if it has a \r in the lines, takes the last one and compose another string
// out of that.
func cleanFlushInfo(bytesBuffer *bytes.Buffer) string {
scanner := bufio.NewScanner(bytesBuffer)
finalString := ""
for scanner.Scan() {
line := scanner.Text()
chunks := strings.Split(line, "\r")
lastChunk := chunks[len(chunks)-1] // fetch the last update of the line
finalString += lastChunk + "\n"
}
return finalString
}
為什么效率不高?隨著時間的推移,日志會越來越長。程序?yàn)閯h除不需要的信息而必須做的工作也會增加。
解決問題的方法是只從容器中獲取 N 分鐘的輸出。通過列出許多基于時間塊的文件或覆蓋文件(gist 仍將保留舊信息),將它們列在 Gist 上。
- 1 回答
- 0 關(guān)注
- 181 瀏覽
添加回答
舉報