gpt4 book ai didi

go - 是否可以修改 Golang 堆栈跟踪?

转载 作者:数据小太阳 更新时间:2023-10-29 03:23:22 24 4
gpt4 key购买 nike

我正在将应用程序部署到云服务提供商,但只能逐行提取日志。我希望能够用其他字符替换堆栈转储中的换行符,这样我就可以将堆栈跟踪放在一起。

是否可以采取任何措施来操纵程序失败时转储的堆栈跟踪?

最佳答案

您可以在 recover panic 的函数中运行所有内容,然后对恢复的任何 panic 执行您想要的操作:

func main() {
defer func() {
if r := recover(); r != nil {
// Log whatever/however you want
os.Exit(1) // to terminate the program
}
}()
// the rest of your code here
}

请注意,这有局限性。它不会捕获在 main() 之外发生的任何 panic ,在某些程序中,这几乎是一切。特别是,它不会在以下情况下引发 panic :

  • 去例行公事
  • init() 函数
  • 隐式初始化代码,即全局 `var x =/* 一些可能会崩溃的函数 */``

对于这些情况,可以在每个关键时刻使用(并调用)更通用的 panic 处理程序。即

func handlePanic() {
if r := recover(); r != nil {
// Do your logging
os.Exit(1)
}
}

// then later ...
func init() {
defer handlePanic()
// do stuff
}

// or ...
go func() {
defer handlePanic()
// do things that may panic
}()

在任何这些情况下,您都将被迫进行自己的堆栈跟踪处理。使用 runtime.Caller 或类似的方法来构建堆栈跟踪,然后创建所需的输出。请注意,堆栈跟踪不会与您之前看到的完全相同,因为它现在是在代码的不同部分创建的。通过跳过帧或在其他地方记录堆栈跟踪等方式为您的案例获取理想的堆栈跟踪,留给读者作为练习。

关于go - 是否可以修改 Golang 堆栈跟踪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49061561/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com