108 lines
2.6 KiB
Go
108 lines
2.6 KiB
Go
|
package middleware
|
|||
|
|
|||
|
import (
|
|||
|
"bytes"
|
|||
|
"gitee.ltd/lxh/logger/log"
|
|||
|
"github.com/gin-gonic/gin"
|
|||
|
jsoniter "github.com/json-iterator/go"
|
|||
|
"io"
|
|||
|
"regexp"
|
|||
|
"strings"
|
|||
|
"time"
|
|||
|
"wireguard-dashboard/model/entity"
|
|||
|
"wireguard-dashboard/repository"
|
|||
|
)
|
|||
|
|
|||
|
// bodyWriter
|
|||
|
// @description: 重写ResponseBody
|
|||
|
type bodyWriter struct {
|
|||
|
gin.ResponseWriter
|
|||
|
body *bytes.Buffer
|
|||
|
}
|
|||
|
|
|||
|
func SystemLogRequest() gin.HandlerFunc {
|
|||
|
return func(c *gin.Context) {
|
|||
|
var userId string
|
|||
|
if userInfo, ok := c.Get("user"); ok {
|
|||
|
userId = userInfo.(*entity.User).Id
|
|||
|
}
|
|||
|
|
|||
|
// 开始时间
|
|||
|
start := time.Now()
|
|||
|
host := c.Request.Host // 请求域名
|
|||
|
path := c.Request.URL.Path // 接口地址
|
|||
|
query := c.Request.URL.RawQuery // 参数
|
|||
|
if strings.Contains(path, "/api/dashboard/list") {
|
|||
|
c.Next()
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
var bodyStr string
|
|||
|
if !strings.Contains(path, "/api/login") {
|
|||
|
body, err := c.GetRawData() // body参数
|
|||
|
if err == nil {
|
|||
|
bodyStr = string(body)
|
|||
|
c.Request.Body = io.NopCloser(bytes.NewBuffer(body))
|
|||
|
reg := regexp.MustCompile("\\s+")
|
|||
|
bodyStr = reg.ReplaceAllString(bodyStr, "")
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
method := c.Request.Method // 请求方式
|
|||
|
ip := c.ClientIP() // 取出IP
|
|||
|
// 处理实际客户端IP
|
|||
|
if c.Request.Header.Get("U-Real-Ip") != "" {
|
|||
|
ip = c.Request.Header.Get("U-Real-Ip") // 这个是网关Nginx自定义的Header头
|
|||
|
} else if c.Request.Header.Get("U-Forwarded-For") != "" {
|
|||
|
ip = c.Request.Header.Get("U-Forwarded-For") // 这个是网关Nginx自定义的Header头
|
|||
|
}
|
|||
|
ua := c.Request.UserAgent() // UA
|
|||
|
|
|||
|
// 重写客户端IP
|
|||
|
c.Request.Header.Set("X-Forwarded-For", ip)
|
|||
|
c.Request.Header.Set("X-Real-Ip", ip)
|
|||
|
|
|||
|
// 拦截response
|
|||
|
bw := &bodyWriter{body: bytes.NewBufferString(""), ResponseWriter: c.Writer}
|
|||
|
c.Writer = bw
|
|||
|
|
|||
|
header := c.Request.Header
|
|||
|
headerStr, _ := jsoniter.MarshalToString(header)
|
|||
|
|
|||
|
// 执行下一步请求
|
|||
|
c.Next()
|
|||
|
// 计算耗时
|
|||
|
cost := time.Since(start).Milliseconds()
|
|||
|
|
|||
|
// 组装实体
|
|||
|
l := entity.SystemLog{
|
|||
|
UserId: userId,
|
|||
|
ClientIP: ip,
|
|||
|
Host: host,
|
|||
|
Method: method,
|
|||
|
Uri: path,
|
|||
|
Header: headerStr,
|
|||
|
Body: bodyStr,
|
|||
|
Form: "",
|
|||
|
Query: query,
|
|||
|
UserAgent: ua,
|
|||
|
Cost: cost,
|
|||
|
StatusCode: c.Writer.Status(),
|
|||
|
Response: "",
|
|||
|
}
|
|||
|
|
|||
|
// 如果不是返回200,把返回值保存一下
|
|||
|
if c.Writer.Status() != 200 {
|
|||
|
resp := bw.body.String()
|
|||
|
l.Response = resp
|
|||
|
}
|
|||
|
|
|||
|
go func() {
|
|||
|
if er := repository.SystemLog().SaveLog(&l); er != nil {
|
|||
|
log.Debugf("请求日志: %+v", l)
|
|||
|
log.Errorf("保存请求日志失败: %v", er)
|
|||
|
}
|
|||
|
}()
|
|||
|
}
|
|||
|
}
|