main.go
...
gin.SetMode(mode)
engine := gin.New()
engine.Use(gzip.Gzip(gzip.DefaultCompression))
engine.Use(middlewares.Logger())
...
loggerMiddleware.go
package middlewares
import (
"fmt"
"github.com/gin-gonic/gin"
rotatelogs "github.com/lestrrat-go/file-rotatelogs"
"github.com/rifflock/lfshook"
"github.com/sirupsen/logrus"
"os"
"time"
)
func Logger() gin.HandlerFunc {
log := logrus.New()
filePath := "logs/"
fileName := ""
file := filePath + fileName
log.Out = os.Stdout
log.SetLevel(logrus.DebugLevel)
writer, _ := rotatelogs.New(
file+"%Y%m%d.log",
rotatelogs.WithMaxAge(7*24*time.Hour),
rotatelogs.WithRotationTime(24*time.Hour),
)
writeMap := lfshook.WriterMap{
logrus.PanicLevel: writer,
logrus.FatalLevel: writer,
logrus.ErrorLevel: writer,
logrus.WarnLevel: writer,
logrus.InfoLevel: writer,
logrus.DebugLevel: writer,
}
hook := lfshook.NewHook(writeMap, &logrus.JSONFormatter{
TimestampFormat: "2006-01-02 15:04:05",
})
log.AddHook(hook)
return func(c *gin.Context) {
startTime := time.Now()
c.Next()
spendTime := time.Since(startTime).Milliseconds()
ST := fmt.Sprintf("%d ms", spendTime)
statusCode := c.Writer.Status()
clientIP := c.ClientIP()
dataSize := c.Writer.Size()
if dataSize < 0 {
dataSize = 0
}
method := c.Request.Method
path := c.Request.RequestURI
entry := log.WithFields(logrus.Fields{
"Status": statusCode,
"SpendTime": ST,
"IP": clientIP,
"Method": method,
"Path": path,
})
if len(c.Errors) > 0 {
log.Error(c.Errors.ByType(gin.ErrorTypePrivate).String())
}
if statusCode >= 500 {
entry.Error()
} else if statusCode >= 400 {
entry.Warn()
} else {
entry.Info()
}
}
}