如何通过匹配的行获取堆栈跟踪和过滤

问题描述 投票:0回答:2

我在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()写入stdout但返回void。如何获取堆栈跟踪并仅从中打印出某些行

go stack-trace printstacktrace
2个回答
0
投票

您可以使用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)
}


0
投票

This is my go to file for stack traces

但是,在您的情况下,您也在打印索引和字节值时在字节数组上循环。显然,您得到的是很多数字。

请记住字符串在内部构造为[]字节。因此,debug.Stack()本质上是返回字符串

只需使用strings.Split(string(debug.Stack()), "\n")获取行,并遍历返回的数组即可应用过滤器

© www.soinside.com 2019 - 2024. All rights reserved.