日志解析实践中的坑

60 阅读1分钟

一、异常字符

  • 有些开源框架卡bug时会输出NUL字符,NUL字符的Unicode码点是\u0000,可能显示为^@
    • 解决方法:strings.TrimLeft(line.Text, "\u0000")
  • python打印进度会用回退符\r,应考虑切分成多行处理。

二、golang解析python打印的进度条

func parse() {
    // 示例: 69%|██████▉   | 22/32 [13:15<06:02, 36.23s/it]
    if len(text) > 6 && strings.Contains(text[:6], "%|") {
        numStr := strings.TrimSpace(text[:strings.Index(text[:6], "%|")])
        num, err := strconv.Atoi(numStr)
        if err != nil {
            return
        }

        // 解析耗时,可忽略失败
        costStr := text[6:]
        if idx := strings.Index(costStr, "["); idx != -1 {
            costStr = costStr[idx+1:]
            if idx = strings.Index(costStr, "<"); idx > 4 {
                remainStr := costStr[idx+1:]
                costStr = costStr[:idx]
                var cost time.Duration
                cost, err = utils.ParseDuration(costStr)
                if err != nil {
                    return
                }

                if idx = strings.Index(remainStr, ","); idx > 4 {
                    remainStr = remainStr[:idx]
                    var remain time.Duration
                    remain, err = utils.ParseDuration(remainStr)
                    if err != nil {
                        return
                    }
                }
                return
            }
        }
        return
    }
}