Go 结构化日志与错误处理实践
当系统接口数量超过几十个时,日志质量直接决定排查效率。如果日志只是简单的 log.Println(err),后期排查几乎无从下手。
一、结构化日志的意义
使用结构化日志库可以输出 JSON 格式日志:
logger.Info(“api request”,
zap.String(“path”, “/api/data”),
zap.Int(“status”, 200),
zap.Duration(“cost”, cost),
)
这样日志可以直接被日志系统解析,而不是依赖文本搜索。
二、统一错误模型
定义统一错误结构:
type ApiError struct {
Code int
Message string
Err error
}
统一包装错误:
return &ApiError{
Code: resp.StatusCode,
Message: “request failed”,
Err: err,
}
这样业务层可以根据 Code 做精确处理,而不是简单判断 error 是否为空。
三、记录耗时与链路
每次请求都记录耗时,可以快速定位慢接口:
start := time.Now()
…
cost := time.Since(start)
如果结合 traceID,跨服务问题也更容易定位。
在对接实时数据接口时,结构化日志尤其重要。因为数据更新频繁,一旦出现延迟或异常,通过日志中的耗时字段可以快速判断是网络问题还是解析问题。
日志不是为了记录“发生了什么”,而是为了在问题出现时快速找到原因。结构化设计会让系统维护成本大幅下降。
本作品采用《CC 协议》,转载必须注明作者和本文链接
learnnnn 的个人博客
关于 LearnKu