You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 23:45:57