Как получить трассировку стека и фильтровать по совпадающим строкам - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть это в Golang:

 if err := recover(); err != nil {

    log.Error("Caught error in defer/recover middleware: ", err)
    for i,v := range debug.Stack(){
        fmt.Println("stack:", v);
        if strings.Index(string(v),"go/src/github.com/us/our-project") >= 0 {
          log.Error("stack trace line", i, ": ",v)
        }
    }

}

, кажется, просто кучка целых. Проблема в том, что debug.PrintStack () пишет в стандартный вывод, но возвращает void. Как я могу получить трассировку стека и распечатать из нее только определенные строки

1 Ответ

0 голосов
/ 28 февраля 2020

Вы можете использовать runtime/debug.Stack, чтобы получить байты, а затем обрабатывать их построчно, используя bufio.Scanner, чтобы сосредоточиться на интересующих вас строках. Например:

stackScanner := bufio.NewScanner(bytes.NewReader(debug.Stack()))
for stackScanner.Scan() {
    line := stackScanner.Text()
    // do your processing here to determine whether to prin the line
    fmt.Println(line)
}

...