大家好,用go开发web的同学日志里面是怎么记录request id的呢,不想每个业务方法里面添加request id参数或者context报数
大家好,用go开发web的同学日志里面是怎么记录request id的呢,不想每个业务方法里面添加request id参数或者context报数
采用中间件形式. 以gin
为例
reqId
中间件, 主要的作用是生成 reqId
func ReqIdMiddleware() gin.HandlerFunc {
return func(ctx *gin.Context){
reqId := ctx.Request.Header.Get("X-Request-Id")
if reqId == "" {
reqId = uuid.NewV4().String()
ctx.Request.Header.Set("X-Request-Id", reqId)
}
// 写入响应
ctx.Header("X-Request-Id", reqId)
ctx.Next()
}
}
日志中间件
func Log() gin.HandlerFunc {
return func(ctx *gin.Context){
reqId := ctx.Request.Header.Get("X-Request-Id")
ctx.Next()
logrus.WithField("X-Request-Id", reqId).Info("...")
}
}
应该先调用 Req中间件,后调用Log中间件
e.Use(ReqIdMiddleware(), Log())
7 回答5.3k 阅读
6 回答6.8k 阅读✓ 已解决
4 回答2.3k 阅读
1 回答3.4k 阅读
2 回答934 阅读✓ 已解决
2 回答2.3k 阅读
1 回答2.2k 阅读
那肯定是要在中间键中将ID添加到 ctx 中了。
如果要求有顺序可以使用 snowflake 生成id。
若是想在 ID 中携带点信息,比如时间或其他。
可以自定义ID生成方法,不过需要防止碰撞,比如要求生成的ID为64bit,那么时间不要用“1970年1月1”全量的,自己设置一个起点,比如从当前开始加 20年,以毫秒为单位,占用 n bit,然后剩下的 64 - n 位可填充其他信息(要防止碰撞)