123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- package middleware
- import (
- "bytes"
- "encoding/json"
- "gadmin/config"
- "gadmin/internal/admin/consts"
- "gadmin/internal/gorm/model"
- "gadmin/utility/token"
- "github.com/gin-gonic/gin"
- "github.com/sirupsen/logrus"
- "io"
- "net/http"
- "os"
- "time"
- )
- // Logger 访问日志
- func Logger(c *gin.Context) {
- var (
- start = time.Now() // 开始时间
- body []byte
- err error
- )
- if c.Request.Method != http.MethodGet {
- body, err = io.ReadAll(c.Request.Body)
- if err != nil {
- logrus.Warnf("read body from request error:%v", err)
- } else {
- c.Request.Body = io.NopCloser(bytes.NewBuffer(body))
- }
- }
- writer := responseBodyWriter{
- ResponseWriter: c.Writer,
- body: &bytes.Buffer{},
- }
- c.Writer = writer
- // 处理请求
- c.Next()
- // 结束时间
- var (
- adminID int64 = 0
- user = token.CurrentUser(c)
- getMap = make(map[string]interface{})
- headerMap = make(map[string]interface{})
- end = time.Now()
- )
- if user != nil {
- adminID = user.ID
- }
- for k, v := range c.Request.URL.Query() {
- getMap[k] = v
- }
- getByte, _ := json.Marshal(getMap)
- for k, v := range c.Request.Header {
- headerMap[k] = v
- }
- headerByte, _ := json.Marshal(headerMap)
- //remark := ""
- //if c.Request.Method == http.MethodPost {
- // remark = config.GetMenuName(c.Request.URL.Path)
- //}
- models := &model.AdminLog{
- Environment: os.Getenv("GIN_MODE"),
- AdminID: adminID,
- AppID: consts.AppAdmin,
- UserAgent: c.Request.UserAgent(),
- Method: c.Request.Method,
- URL: "http://" + c.Request.Host + c.Request.RequestURI,
- Host: c.Request.Host,
- Path: c.Request.URL.Path,
- GetData: string(getByte),
- PostData: string(body),
- HeaderData: string(headerByte),
- AccessIP: c.ClientIP(),
- StatusCode: int32(writer.Status()),
- ErrorMessage: c.Errors.ByType(gin.ErrorTypePrivate).String(),
- Data: writer.body.String(),
- Latency: int32(end.Sub(start).Milliseconds()),
- //Remark: remark,
- Timestamp: time.Now(),
- }
- //
- //logrus.Warnf("models:%#v", models)
- // 日志文件
- //config.AccessLog.WithFields(utility.JSONMethod(models)).Infoln()
- data := logrus.Fields{
- "clientIp": c.ClientIP(), // 访问IP
- "method": c.Request.Method, // 访问方式
- "get": c.Request.URL.Query().Encode(),
- "latency": end.Sub(start), // 执行事件
- "code": c.Writer.Status(), // 状态码
- "path": c.Request.URL.Path, // 访问路由
- "ua": c.Request.UserAgent(),
- }
- config.AccessLog.WithFields(data).Infoln()
- // 队列
- go config.Nats.Publish(consts.NatsTopicAdminLog, models)
- }
- type responseBodyWriter struct {
- gin.ResponseWriter
- body *bytes.Buffer
- }
- func (r responseBodyWriter) Write(b []byte) (int, error) {
- r.body.Write(b)
- return r.ResponseWriter.Write(b)
- }
|