ユーザーアイコン

mizuko

3か月前

0
0

Go + Gin で Request ID を付与する

Go
Gin

Go + Ginのmiddlewareの仕組みを使って実現する。 middlewareの仕組みはこちらに記載

adapter/http/middleware/request_id.go

package middleware import ( "context" "github.com/gin-gonic/gin" "hoge/constants" ) func RequestIDMiddleware() gin.HandlerFunc { return func(c *gin.Context) { requestID := c.Request.Header.Get("X-Request-ID") ctx := c.Request.Context() ctx = context.WithValue(ctx, constants.RequestIDKey, requestID) c.Request = c.Request.WithContext(ctx) c.Next() } }

hoge/constants/context.go

package constants type requestIDKeyType struct{} var RequestIDKey = requestIDKeyType{}

adapter/http/middleware/logger.go

package middleware import ( "fmt" "time" "github.com/gin-gonic/gin" ) var customLogFormatter = func(param gin.LogFormatterParams) string { var statusColor, methodColor, resetColor string if param.IsOutputColor() { statusColor = param.StatusCodeColor() methodColor = param.MethodColor() resetColor = param.ResetColor() } if param.Latency > time.Minute { param.Latency = param.Latency.Truncate(time.Second) } return fmt.Sprintf("[GIN] %v| %s |%s %3d %s| %13v | %15s |%s %-7s %s %#v\n%s", param.TimeStamp.Format("2006/01/02 - 15:04:05"), param.Request.Header.Get("X-Request-ID"), statusColor, param.StatusCode, resetColor, param.Latency, param.ClientIP, methodColor, param.Method, resetColor, param.Path, param.ErrorMessage, ) } func LoggerConfig() gin.LoggerConfig { conf := gin.LoggerConfig{} conf.Formatter = customLogFormatter return conf }

adapter/http/router/router.go

~ 略 ~ func (r *Router) SetupRoutes(e *gin.Engine) { e.Use(requestid.New()) e.Use(gin.LoggerWithConfig(middleware.LoggerConfig())) e.Use(gin.Recovery()) e.Use(middleware.RequestIDMiddleware()) ~ 略 ~

参考: https://github.com/gin-gonic/gin/blob/7a865dcf1dbe6ec52e074b1ddce830d278eb72cf/logger.go#L141 https://github.com/gin-gonic/gin/blob/7a865dcf1dbe6ec52e074b1ddce830d278eb72cf/gin.go#L224