mh_goadmin_server/app/admin/middleware/logger.go

157 lines
3.7 KiB
Go

package middleware
import (
"bytes"
"fmt"
"go-admin/common/global"
"go-admin/logger"
config2 "go-admin/tools/config"
"io"
"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 {
SetDBOperLog(c, clientIP, statusCode, reqUri, reqMethod, latencyTime, req.(string), response.(string))
}
}
// 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.BusinessType = "10"
sysOperLog.Title = "用户登录"
sysOperLog.OperName = "-"
} else if strings.Contains(reqUri, "/api/v1/logout") {
sysOperLog.BusinessType = "11"
} else if strings.Contains(reqUri, "/api/v1/getCaptcha") {
sysOperLog.BusinessType = "12"
sysOperLog.Title = "验证码"
} else {
if reqMethod == "POST" {
sysOperLog.BusinessType = "1"
} else if reqMethod == "PUT" {
sysOperLog.BusinessType = "2"
} else if reqMethod == "DELETE" {
sysOperLog.BusinessType = "3"
}
}
sysOperLog.Method = reqMethod
if len(menuList) > 0 {
sysOperLog.Title = menuList[0].Title
}
b, _ := c.Get("body")
sysOperLog.OperParam, _ = tools.StructToJsonStr(b)
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()
}