golang web如何在日志记录request id

大家好,用go开发web的同学日志里面是怎么记录request id的呢,不想每个业务方法里面添加request id参数或者context报数

阅读 6.9k
2 个回答

那肯定是要在中间键中将ID添加到 ctx 中了。

如果要求有顺序可以使用 snowflake 生成id。
若是想在 ID 中携带点信息,比如时间或其他。
可以自定义ID生成方法,不过需要防止碰撞,比如要求生成的ID为64bit,那么时间不要用“1970年1月1”全量的,自己设置一个起点,比如从当前开始加 20年,以毫秒为单位,占用 n bit,然后剩下的 64 - n 位可填充其他信息(要防止碰撞)

采用中间件形式. 以gin为例

  1. 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()
    }
}
  1. 日志中间件

    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("...")
     }
    }
    
  2. 使用方式:

应该先调用 Req中间件,后调用Log中间件

 e.Use(ReqIdMiddleware(), Log())
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题