package middleware import ( "confrontation-training/common" "confrontation-training/global" "github.com/gin-gonic/gin" rotatelogs "github.com/lestrrat-go/file-rotatelogs" "github.com/rifflock/lfshook" "github.com/sirupsen/logrus" "os" "path" "time" ) // LoggerToFile 日志记录到文件 func LoggerToFile() gin.HandlerFunc { logFilePath := global.Config.Log2File.FilePath + common.NowTime("2006-01-02") logFileName := global.Config.Log2File.FileName + global.Config.Log2File.FileSuffix // 日志文件 fileName := path.Join(logFilePath, logFileName) // 写入文件 err := os.MkdirAll(logFilePath, os.ModePerm) if err != nil { panic(err) return nil } //src, err := os.OpenFile(fileName, os.O_CREATE|os.O_RDWR|os.O_APPEND, os.ModeAppend|os.ModePerm) //if err != nil { // fmt.Println("err", err) // panic(err) //} src, _ := os.OpenFile(fileName, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) // 实例化 logger := logrus.New() // 设置输出 logger.Out = src // 设置日志级别 logger.SetLevel(logrus.DebugLevel) logger.SetFormatter(&logrus.JSONFormatter{TimestampFormat: "2006-01-02 15:04:05"}) // 设置 rotatelogs logWriter, err := rotatelogs.New( // 分割后的文件名称 fileName+".%Y%m%d.log", // 生成软链,指向最新日志文件 rotatelogs.WithLinkName(fileName), // 设置最大保存时间(7天) rotatelogs.WithMaxAge(7*24*time.Hour), // 设置日志切割时间间隔(1天) rotatelogs.WithRotationTime(24*time.Hour), ) writeMap := lfshook.WriterMap{ logrus.InfoLevel: logWriter, logrus.FatalLevel: logWriter, logrus.DebugLevel: logWriter, logrus.WarnLevel: logWriter, logrus.ErrorLevel: logWriter, logrus.PanicLevel: logWriter, } lfHook := lfshook.NewHook(writeMap, &logrus.JSONFormatter{ TimestampFormat: "2006-01-02 15:04:05", }) // 新增 Hook logger.AddHook(lfHook) return func(c *gin.Context) { // 开始时间 startTime := time.Now() // 处理请求 c.Next() // 结束时间 endTime := time.Now() // 执行时间 latencyTime := endTime.Sub(startTime) // 请求方式 reqMethod := c.Request.Method // 请求路由 reqUri := c.Request.RequestURI // 状态码 statusCode := c.Writer.Status() // 请求IP //clientIP := c.ClientIP() clientIP := c.RemoteIP() //请求参数 requestParam := c.Params // 日志格式 logger.WithFields(logrus.Fields{ "status_code": statusCode, "latency_time": latencyTime, "client_ip": clientIP, "req_method": reqMethod, "req_uri": reqUri, "req_param": requestParam, }).Info() } } // LoggerToMongo 日志记录到 MongoDB func LoggerToMongo() gin.HandlerFunc { return func(c *gin.Context) { } } // LoggerToES 日志记录到 ES func LoggerToES() gin.HandlerFunc { return func(c *gin.Context) { } } // LoggerToMQ 日志记录到 MQ func LoggerToMQ() gin.HandlerFunc { return func(c *gin.Context) { } }