Files
mayfly-go/server/pkg/req/log_handler.go

102 lines
2.2 KiB
Go
Raw Normal View History

2023-01-14 16:29:52 +08:00
package req
2021-04-16 15:10:07 +08:00
import (
"fmt"
"mayfly-go/pkg/biz"
"mayfly-go/pkg/logger"
"mayfly-go/pkg/utils"
2021-04-16 15:10:07 +08:00
"runtime/debug"
"github.com/sirupsen/logrus"
2021-04-16 15:10:07 +08:00
)
2023-01-14 16:29:52 +08:00
type SaveLogFunc func(*Ctx)
var saveLog SaveLogFunc
// 设置保存日志处理函数
func SetSaveLogFunc(sl SaveLogFunc) {
saveLog = sl
}
2021-04-16 15:10:07 +08:00
type LogInfo struct {
LogResp bool // 是否记录返回结果
Description string // 请求描述
Save bool // 是否保存日志
2021-04-16 15:10:07 +08:00
}
// 新建日志信息
2021-04-16 15:10:07 +08:00
func NewLogInfo(description string) *LogInfo {
2021-04-21 10:22:09 +08:00
return &LogInfo{Description: description, LogResp: false}
2021-04-16 15:10:07 +08:00
}
// 是否记录返回结果
2021-04-16 15:10:07 +08:00
func (i *LogInfo) WithLogResp(logResp bool) *LogInfo {
i.LogResp = logResp
return i
}
// 是否保存日志
func (i *LogInfo) WithSave(saveLog bool) *LogInfo {
i.Save = saveLog
return i
}
2023-01-14 16:29:52 +08:00
func LogHandler(rc *Ctx) error {
2021-04-16 15:10:07 +08:00
li := rc.LogInfo
2021-04-21 10:22:09 +08:00
if li == nil {
return nil
2021-04-16 15:10:07 +08:00
}
lfs := logrus.Fields{}
2021-04-16 15:10:07 +08:00
if la := rc.LoginAccount; la != nil {
lfs["uid"] = la.Id
lfs["uname"] = la.Username
}
req := rc.GinCtx.Request
2021-04-16 15:10:07 +08:00
lfs[req.Method] = req.URL.Path
// 如果需要保存日志,并且保存日志处理函数存在则执行保存日志函数
if li.Save && saveLog != nil {
go saveLog(rc)
}
if err := rc.Err; err != nil {
logger.Log.WithFields(lfs).Error(getErrMsg(rc, err))
return nil
2021-04-16 15:10:07 +08:00
}
logger.Log.WithFields(lfs).Info(getLogMsg(rc))
return nil
2021-04-16 15:10:07 +08:00
}
2023-01-14 16:29:52 +08:00
func getLogMsg(rc *Ctx) string {
2021-04-21 10:22:09 +08:00
msg := rc.LogInfo.Description + fmt.Sprintf(" ->%dms", rc.timed)
2023-01-19 19:45:12 +08:00
if !utils.IsBlank(rc.ReqParam) {
2022-11-18 17:52:30 +08:00
msg = msg + fmt.Sprintf("\n--> %s", utils.ToString(rc.ReqParam))
2021-04-16 15:10:07 +08:00
}
// 返回结果不为空,则记录返回结果
2023-01-19 19:45:12 +08:00
if rc.LogInfo.LogResp && !utils.IsBlank(rc.ResData) {
2022-11-18 17:52:30 +08:00
msg = msg + fmt.Sprintf("\n<-- %s", utils.ToString(rc.ResData))
2021-04-16 15:10:07 +08:00
}
return msg
}
2023-01-14 16:29:52 +08:00
func getErrMsg(rc *Ctx, err interface{}) string {
2021-04-16 15:10:07 +08:00
msg := rc.LogInfo.Description
2023-01-19 19:45:12 +08:00
if !utils.IsBlank(rc.ReqParam) {
2022-11-18 17:52:30 +08:00
msg = msg + fmt.Sprintf("\n--> %s", utils.ToString(rc.ReqParam))
2021-04-16 15:10:07 +08:00
}
var errMsg string
switch t := err.(type) {
case biz.BizError:
2021-04-16 15:10:07 +08:00
errMsg = fmt.Sprintf("\n<-e errCode: %d, errMsg: %s", t.Code(), t.Error())
case error:
errMsg = fmt.Sprintf("\n<-e errMsg: %s\n%s", t.Error(), string(debug.Stack()))
case string:
errMsg = fmt.Sprintf("\n<-e errMsg: %s\n%s", t, string(debug.Stack()))
}
return (msg + errMsg)
}