package Middleware import ( "dsSso/Const/DefaultConst" "dsSso/Utils/ConfigUtil" "dsSso/Utils/SsoUtil" "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" "github.com/tracer0tong/kafkalogrus" "time" ) // CSTFormatter 转为东八区时间 type CSTFormatter struct { logrus.Formatter } func (u CSTFormatter) Format(e *logrus.Entry) ([]byte, error) { e.Time = e.Time.Local() return u.Formatter.Format(e) } func init() { var err error var hook *kafkalogrus.KafkaLogrusHook if hook, err = kafkalogrus.NewKafkaLogrusHook( "kh", logrus.AllLevels, &logrus.JSONFormatter{}, []string{ConfigUtil.KafkaAddress}, ConfigUtil.KafkaAccessLogTopic, true, nil); err != nil { panic(err) } //设置日志格式 logrus.SetFormatter(CSTFormatter{&logrus.JSONFormatter{}}) logrus.AddHook(hook) } // 日志记录到 Kafka func LoggerToKafka() gin.HandlerFunc { return func(c *gin.Context) { // 开始时间 startTime := time.Now().Local() // 处理请求 c.Next() // 结束时间 endTime := time.Now().Local() // 执行时间 latencyTime := endTime.Sub(startTime) // 请求方式 reqMethod := c.Request.Method // 请求路由 reqUri := c.Request.RequestURI // 状态码 statusCode := c.Writer.Status() // 请求IP clientIP := c.ClientIP() //统一认证的会话id var identityId = DefaultConst.IdentityId var personId = DefaultConst.PersonId var deviceId = DefaultConst.DeviceId cookie, e := c.Request.Cookie(ConfigUtil.AccessToken) if e == nil { identityId, personId, deviceId = SsoUtil.AnalyzeSessionId(cookie.Value) } // 日志格式 logrus.WithFields(logrus.Fields{ "status_code": statusCode, "access_time": startTime, "latency_time": latencyTime, "client_ip": clientIP, "req_method": reqMethod, "req_uri": reqUri, "device_id": deviceId, "identity_id": identityId, "person_id": personId, }).Info() } }