mh_goadmin_server/app/admin/middleware/logger.go

161 lines
3.8 KiB
Go

package middleware
import (
"bytes"
"fmt"
"go-admin/common/global"
"go-admin/logger"
config2 "go-admin/tools/config"
"io"
"strconv"
"strings"
"time"
"github.com/gin-gonic/gin"
"go-admin/app/admin/models"
"go-admin/tools"
)
// LoggerToFile 日志记录到文件
func LoggerToFile() gin.HandlerFunc {
return func(c *gin.Context) {
RequestInLog(c)
defer RequestOutLog(c)
c.Next()
}
}
// RequestInLog 请求进入日志
func RequestInLog(c *gin.Context) {
// 开始时间
startTime := time.Now()
c.Set("startExecTime", startTime)
// 请求参数
bodyBytes, _ := io.ReadAll(c.Request.Body)
c.Request.Body = io.NopCloser(bytes.NewBuffer(bodyBytes))
c.Set("req", string(bodyBytes))
}
// RequestOutLog 请求输出日志
func RequestOutLog(c *gin.Context) {
// 请求方式
reqMethod := c.Request.Method
// 请求路由
reqUri := c.Request.RequestURI
// 请求IP
clientIP := c.ClientIP()
// 请求参数
req, _ := c.Get("req")
fmt.Println(req)
// 状态码
statusCode := c.Writer.Status()
// 返回参数
response, _ := c.Get("response")
fmt.Println(response)
// 结束时间
endTime := time.Now()
// 执行时间
st, _ := c.Get("startExecTime")
startTime, _ := st.(time.Time)
latencyTime := endTime.Sub(startTime)
/// 日志格式
fmt.Printf("%s [INFO] %s %s %3d %13v %15s \r\n",
startTime.Format("2006-01-02 15:04:05"),
reqMethod,
reqUri,
statusCode,
latencyTime,
clientIP,
)
logger.Info(
"log request",
logger.Field("status", statusCode),
logger.Field("spendTime", latencyTime),
logger.Field("clientId", clientIP),
logger.Field("method", reqMethod),
logger.Field("uri", reqUri),
logger.Field("reqBody", req),
logger.Field("response", response),
logger.Field("requestId", tools.GenerateMsgIDFromContext(c)),
)
//只有在白名单中的url才记录操作日志
resultUrl := strings.Replace(c.Request.RequestURI, "/api/v1", "", 1)
_, ok := global.WHILTE[resultUrl]
if c.Request.Method != "GET" && c.Request.Method != "OPTIONS" && config2.LoggerConfig.EnabledDB && ok {
reqParam, respParam := "", ""
if req != nil {
reqParam = req.(string)
}
if response != nil {
respParam = response.(string)
}
SetDBOperLog(c, clientIP, statusCode, reqUri, reqMethod, latencyTime, reqParam, respParam)
}
}
// SetDBOperLog 写入操作日志表
func SetDBOperLog(c *gin.Context, clientIP string, statusCode int, reqUri string, reqMethod string,
latencyTime time.Duration, req string, resp string) {
menu := models.Menu{}
menu.Path = reqUri
menu.Action = reqMethod
menuList, _ := menu.Get()
sysOperLog := models.SysOperLog{}
sysOperLog.OperIp = clientIP
sysOperLog.OperLocation = tools.GetLocation(clientIP)
sysOperLog.Status = tools.IntToString(statusCode)
sysOperLog.OperName = tools.GetUserName(c)
sysOperLog.RequestMethod = c.Request.Method
sysOperLog.OperUrl = reqUri
if reqUri == "/login" {
sysOperLog.Title = "用户登录"
sysOperLog.OperName = "-"
} else if strings.Contains(reqUri, "/api/v1/getCaptcha") {
sysOperLog.Title = "验证码"
}
// 从白名单中读取对应的操作类型
resultUrl := strings.Replace(c.Request.RequestURI, "/api/v1", "", 1)
nType, _ := global.WHILTE[resultUrl]
sysOperLog.BusinessType = strconv.Itoa(nType)
sysOperLog.Method = reqMethod
if len(menuList) > 0 {
sysOperLog.Title = menuList[0].Title //事件
menu.Title = menuList[0].Title
sysOperLog.MenuTitle, _ = menu.GetParentTitle() //操作模块
}
sysOperLog.CreateBy = tools.GetUserName(c)
sysOperLog.OperTime = tools.GetCurrentTime()
sysOperLog.LatencyTime = (latencyTime).String()
sysOperLog.UserAgent = c.Request.UserAgent()
if c.Err() == nil {
sysOperLog.Status = "0"
} else {
sysOperLog.Status = "1"
}
sysOperLog.OperParam = req
sysOperLog.JsonResult = resp
_, _ = sysOperLog.Create()
}