mirror of
https://github.com/go-admin-team/go-admin.git
synced 2026-09-21 10:13:01 +00:00
The pinned core dated from April, before sdk stopped being a separate module, so the build resolved sdk packages from the old module and core packages from the new one. Dropping the separate requirement is what makes the two agree again. Most of the diff is renames that came with that: the tenant accessors gained a ByTenant suffix, GetDb now returns one database and GetAllDb the map, and casbin moved to v3. The change that matters is four call sites moving from GetMemoryQueue to GetQueuePrefix. GetMemoryQueue returns a queue fixed at construction, so the login log, the operate log and the api check ran in process no matter what the settings file selected — a second instance saw none of it. GetQueuePrefix returns whatever the configuration built, which is the point of being able to configure a queue at all. Verified against core at main: build and vet clean. The two file_store failures are unchanged from before this branch; they need cloud credentials.
139 lines
3.5 KiB
Go
139 lines
3.5 KiB
Go
package middleware
|
|
|
|
import (
|
|
"bufio"
|
|
"bytes"
|
|
"encoding/json"
|
|
"go-admin/app/admin/service/dto"
|
|
"go-admin/common"
|
|
"io"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/go-admin-team/go-admin-core/sdk"
|
|
"github.com/go-admin-team/go-admin-core/sdk/api"
|
|
"github.com/go-admin-team/go-admin-core/sdk/config"
|
|
"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user"
|
|
|
|
"go-admin/common/global"
|
|
)
|
|
|
|
// LoggerToFile 日志记录到文件
|
|
func LoggerToFile() gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
log := api.GetRequestLogger(c)
|
|
// 开始时间
|
|
startTime := time.Now()
|
|
// 处理请求
|
|
var body string
|
|
switch c.Request.Method {
|
|
case http.MethodPost, http.MethodPut, http.MethodGet, http.MethodDelete:
|
|
bf := bytes.NewBuffer(nil)
|
|
wt := bufio.NewWriter(bf)
|
|
_, err := io.Copy(wt, c.Request.Body)
|
|
if err != nil {
|
|
log.Warnf("copy body error, %s", err.Error())
|
|
err = nil
|
|
}
|
|
rb, _ := ioutil.ReadAll(bf)
|
|
c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(rb))
|
|
body = string(rb)
|
|
}
|
|
|
|
c.Next()
|
|
url := c.Request.RequestURI
|
|
if strings.Index(url, "logout") > -1 ||
|
|
strings.Index(url, "login") > -1 {
|
|
return
|
|
}
|
|
// 结束时间
|
|
endTime := time.Now()
|
|
if c.Request.Method == http.MethodOptions {
|
|
return
|
|
}
|
|
|
|
rt, bl := c.Get("result")
|
|
var result = ""
|
|
if bl {
|
|
rb, err := json.Marshal(rt)
|
|
if err != nil {
|
|
log.Warnf("json Marshal result error, %s", err.Error())
|
|
} else {
|
|
result = string(rb)
|
|
}
|
|
}
|
|
|
|
st, bl := c.Get("status")
|
|
var statusBus = 0
|
|
if bl {
|
|
statusBus = st.(int)
|
|
}
|
|
|
|
// 请求方式
|
|
reqMethod := c.Request.Method
|
|
// 请求路由
|
|
reqUri := c.Request.RequestURI
|
|
// 状态码
|
|
statusCode := c.Writer.Status()
|
|
// 请求IP
|
|
clientIP := common.GetClientIP(c)
|
|
// 执行时间
|
|
latencyTime := endTime.Sub(startTime)
|
|
// 日志格式
|
|
logData := map[string]interface{}{
|
|
"statusCode": statusCode,
|
|
"latencyTime": latencyTime,
|
|
"clientIP": clientIP,
|
|
"method": reqMethod,
|
|
"uri": reqUri,
|
|
}
|
|
log.WithFields(logData).Info()
|
|
defer func() {
|
|
log.Fields(map[string]interface{}{})
|
|
}()
|
|
if c.Request.Method != "OPTIONS" && config.LoggerConfig.EnabledDB && statusCode != 404 {
|
|
SetDBOperLog(c, clientIP, statusCode, reqUri, reqMethod, latencyTime, body, result, statusBus)
|
|
}
|
|
}
|
|
}
|
|
|
|
// SetDBOperLog 写入操作日志表 fixme 该方法后续即将弃用
|
|
func SetDBOperLog(c *gin.Context, clientIP string, statusCode int, reqUri string, reqMethod string, latencyTime time.Duration, body string, result string, status int) {
|
|
|
|
log := api.GetRequestLogger(c)
|
|
l := make(map[string]interface{})
|
|
l["_fullPath"] = c.FullPath()
|
|
l["operUrl"] = reqUri
|
|
l["operIp"] = clientIP
|
|
l["operLocation"] = "" // pkg.GetLocation(clientIP, gaConfig.ExtConfig.AMap.Key)
|
|
l["operName"] = user.GetUserName(c)
|
|
l["requestMethod"] = reqMethod
|
|
l["operParam"] = body
|
|
l["operTime"] = time.Now()
|
|
l["jsonResult"] = result
|
|
l["latencyTime"] = latencyTime.String()
|
|
l["statusCode"] = statusCode
|
|
l["userAgent"] = c.Request.UserAgent()
|
|
l["createBy"] = user.GetUserId(c)
|
|
l["updateBy"] = user.GetUserId(c)
|
|
if status == http.StatusOK {
|
|
l["status"] = dto.OperaStatusEnabel
|
|
} else {
|
|
l["status"] = dto.OperaStatusDisable
|
|
}
|
|
q := sdk.Runtime.GetQueuePrefix(c.Request.Host)
|
|
message, err := sdk.Runtime.GetStreamMessage("", global.OperateLog, l)
|
|
if err != nil {
|
|
log.Errorf("GetStreamMessage error, %s", err.Error())
|
|
// 日志报错错误,不中断请求
|
|
} else {
|
|
err = q.Append(message)
|
|
if err != nil {
|
|
log.Errorf("Append message error, %s", err.Error())
|
|
}
|
|
}
|
|
}
|