package logger import ( "fmt" "gitea.loveuer.com/yizhisec/packages/logger" "gitea.loveuer.com/yizhisec/packages/opt" "gitea.loveuer.com/yizhisec/packages/tool" "github.com/gin-gonic/gin" "strings" "sync" "time" ) var ( defaultTrace = "middleware-logger" stringBuilderPool = sync.Pool{ New: func() interface{} { return &strings.Builder{} }, } ) func New() gin.HandlerFunc { return func(c *gin.Context) { start := time.Now() ip := c.RemoteIP() trace := c.Request.Header.Get(opt.TraceKey) if trace == "" { if v, ok := c.Request.Context().Value(opt.TraceKey).(string); ok && v != "" { trace = v } else { trace = defaultTrace } } c.Next() status := c.Writer.Status() duration := time.Since(start) var logFn func(msg string, data ...any) switch { case status >= 500: logFn = logger.Error case status >= 400: logFn = logger.Warn default: logFn = logger.Info } if logFn != nil { b := stringBuilderPool.Get().(*strings.Builder) b.Reset() b.WriteString("[") b.WriteString(fmt.Sprintf("%36s", trace)) b.WriteString("] | ") b.WriteString(fmt.Sprintf("%3d", status)) b.WriteString(" | ") b.WriteString(fmt.Sprintf("%15s", ip)) b.WriteString(" | ") b.WriteString(tool.HumanDuration(duration.Nanoseconds())) b.WriteString(" | ") b.WriteString(c.Request.Method) b.WriteString(" | ") b.WriteString(c.Request.RequestURI) logFn(b.String()) stringBuilderPool.Put(b) } } }