定义统一错误结构体AppError,包含错误码、消息、时间戳和调用堆栈,并通过NewAppError构造函数实例化;集成zap等结构化日志库记录JSON格式日志,便于ELK或Loki解析;在Gin等Web框架中使用中间件全局捕获错误并写入日志,同时确保API返回一致的错误格式;建议使用errors.Wrap保留错误上下文,按级别区分错误类型并配置告警,对外部调用错误进行统一包装与记录,实现标准化错误处理流程。

在Go语言项目中,统一错误日志的关键在于结构化记录错误信息、标准化错误类型,并结合日志库进行上下文追踪。以下是实现方式的核心要点。
使用自定义错误结构体,携带错误码、消息、时间戳和调用堆栈等信息,便于后续分析。
type AppError struct {
Code int `json:"code"`
Message string `json:"message"`
Time time.Time `json:"time"`
Trace string `json:"trace,omitempty"`
}
func (e *AppError) Error() string {
return fmt.Sprintf("[%d] %s at %s", e.Code, e.Message, e.Time.Format(time.RFC3339))
}通过构造函数创建一致的错误实例:
func NewAppError(code int, message string) *AppError {
return &AppError{
Code: code,
Message: message,
Time: time.Now(),
Trace: getTrace(), // 可选:runtime.Caller获取调用栈
}
}使用如 zap 或 logrus 这类支持结构化输出的日志库,能更好地记录错误上下文。
立即学习“go语言免费学习笔记(深入)”;
以 zap 为例:
logger, _ := zap.NewProduction()
defer logger.Sync()
// 记录错误
logger.Error("operation failed",
zap.Int("code", err.Code),
zap.String("message", err.Message),
zap.Time("time", err.Time),
zap.String("trace", err.Trace),
)这样输出的JSON日志可被ELK或Loki等系统高效解析。
在Web服务中(如使用 Gin 或 Echo),可通过中间件捕获未处理的错误并写入日志。
Gin 示例:
func ErrorLogger() gin.HandlerFunc {
return func(c *gin.Context) {
c.Next() // 处理请求
for _, err := range c.Errors {
logger.Error("request error",
zap.String("path", c.Request.URL.Path),
zap.String("method", c.Request.Method),
zap.String("error", err.Error()),
)
}
}
}确保所有API返回格式一致:
c.JSON(500, gin.H{
"success": false,
"error": err.Message,
"code": err.Code,
})基本上就这些。核心是标准化错误结构 + 结构化日志输出 + 全局捕获机制,这样能大幅提升排查效率。不复杂但容易忽略。
以上就是如何在Golang中实现统一错误日志的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号