package logger import ( "fmt" "strings" "sync" "time" "gitea.loveuer.com/yizhisec/packages/opt" "gitea.loveuer.com/yizhisec/packages/tool" "github.com/fatih/color" "github.com/gin-gonic/gin" ) const ( defaultTrace = " middleware-logger" ) var ( 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() var ( status string ) _status := c.Writer.Status() duration := time.Since(start) switch { case _status >= 500: status = color.RedString("%3d", _status) case _status >= 400: status = color.YellowString("%3d", _status) default: status = color.GreenString("%3d", _status) } b := stringBuilderPool.Get().(*strings.Builder) b.Reset() b.WriteString("GIN | ") b.WriteString(start.Format("2006-01-02T15:04:05")) b.WriteString(" | ") b.WriteString(trace) b.WriteString(" | ") b.WriteString(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) fmt.Println(b.String()) stringBuilderPool.Put(b) } }