我在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。如何获取堆栈跟踪并仅从中打印出某些行
您可以使用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)
}
This is my go to file for stack traces
但是,在您的情况下,您也在打印索引和字节值时在字节数组上循环。显然,您得到的是很多数字。
请记住字符串在内部构造为[]字节。因此,debug.Stack()
本质上是返回字符串
只需使用strings.Split(string(debug.Stack()), "\n")
获取行,并遍历返回的数组即可应用过滤器