第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何處理包含進(jìn)度條的日志輸出?

如何處理包含進(jìn)度條的日志輸出?

Go
慕姐4208626 2023-03-15 13:42:28
語境這個問題與任何特定的編程語言無關(guān),而是與我們寫入終端和寫入文件時 stdout 的工作方式有關(guān)。無論如何,為了演示,我必須選擇一種語言,我選擇 Python 作為問題部分。我從這個答案中竊取了下面的代碼:將此代碼保存為 progress.py:def progressBar(iterable, prefix = '', suffix = '', decimals = 1, length = 100, fill = '█', printEnd = "\r"):    total = len(iterable)    # Progress Bar Printing Function    def printProgressBar (iteration):        percent = ("{0:." + str(decimals) + "f}").format(100 * (iteration / float(total)))        filledLength = int(length * iteration // total)        bar = fill * filledLength + '-' * (length - filledLength)        print(f'\r{prefix} |{bar}| {percent}% {suffix}', end = printEnd)    # Initial Call    printProgressBar(0)    # Update Progress Bar    for i, item in enumerate(iterable):        yield item        printProgressBar(i + 1)    # Print New Line on Complete    print()import time# A List of Itemsitems = list(range(0, 57))# A Nicer, Single-Call Usagefor item in progressBar(items, prefix = 'Progress:', suffix = 'Complete', length = 50):    # Do stuff...    time.sleep(0.1)當(dāng)您使用 運(yùn)行此程序時python3 progress.py,您會看到一個從左到右的進(jìn)度條。我附上了截圖:如果您自己按照此操作,您會注意到進(jìn)度在同一行更新,即它不會為每個步驟寫一個新行?,F(xiàn)在嘗試將腳本的輸出路由到文件。做一個python3 progress.py > stdout.log。如果此時 cat stdout.log,終端將正確解釋它并顯示最后的輸出,即 100.0% 的完整輸出。實(shí)際問題我正在使用 Docker SDK 和 Go 編程語言從容器中獲取輸出并將其發(fā)布到 Gist。docker 日志的輸出涉及一個這樣的進(jìn)度條。這是我發(fā)布到 Gist 的一個這樣的日志的鏈接:https://gist.github.com/avimanyu786/040243ee1f9a260677080a69ffb88d59我知道在終端上,終端解釋控制字符并重寫該行。當(dāng)我們將它寫入文件時,它會顯示整個內(nèi)容,正如我們在要點(diǎn)中看到的那樣。我理論上的解決方案如果我們以要點(diǎn)輸出為例,我們會看到第 10 行實(shí)際上占用了不止一條視線(邏輯上仍然是 1 條線)。我們還知道,每條視覺線都以一個控制字符結(jié)尾,在 Gist 上它被渲染為方塊。在將輸出發(fā)送到要點(diǎn)之前,我想:以 bytes.Buffer 形式接收日志(如果需要,我可以將其轉(zhuǎn)換為字節(jié)或字符串)。遍歷所有行。如果行中有任何控制字符,則從行首刪除該邏輯行上的最后一個控制字符。這將要做的是只顯示該行的最后更新。我不知道該怎么做。正則表達(dá)式在這里工作嗎?我以前沒有處理過控制字符。如何刪除從行首到最后一個控制字符?
查看完整描述

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 上。


查看完整回答
反對 回復(fù) 2023-03-15
  • 1 回答
  • 0 關(guān)注
  • 181 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號