如何让panic输出适配slog结构化日志格式?
实现panic输出适配slog日志格式的简化方案
可以不用大量自定义代码实现这个需求,核心思路是利用Go标准库的recover捕获panic,结合slog和debug.Stack()直接生成符合要求的结构化日志:
- 全局捕获panic:在程序入口或关键goroutine的defer函数里用
recover拦截panic,不用修改每个panic(err)的调用 - 自动获取堆栈:用
runtime/debug.Stack()直接拿到完整的堆栈追踪内容,无需手动解析堆栈 - 适配slog格式:把panic错误信息和堆栈拼接后,作为
msg字段的值传入slog的错误日志接口
示例代码
package main import ( "log/slog" "runtime/debug" ) func main() { // 全局捕获panic并转为slog格式输出 defer func() { if p := recover(); p != nil { // 整理panic信息和堆栈 errStr := "" switch v := p.(type) { case error: errStr = v.Error() case string: errStr = v default: errStr = "unknown panic type" } fullMsg := errStr + "\n" + string(debug.Stack()) // 输出符合slog格式的日志,完整内容嵌套在msg字段 slog.Error("panic triggered", slog.String("msg", fullMsg)) } }() // 测试panic panic("failed to process request: invalid parameter") }
说明
- 这段代码只需要在程序入口加一次defer处理,所有panic都会被自动捕获并转为slog格式输出
- 兼容不同类型的panic参数(error或string),保证不会因为类型问题报错
- 输出的日志中,
msg字段包含完整的错误信息和堆栈追踪,完全满足日志聚合的解析需求
内容的提问来源于stack exchange,提问作者red888
相关产品推荐
相关产品推荐

