正常情况的操作日志代码如下:
func (Project *ProjectManagerRouter) InitProjectManagerRouterGroup(Router *gin.RouterGroup) {
projectPrivateGroup := Router.Group("project")
projectGroup := Router.Group("project").Use(middleware.OperationRecord())
projectApi := v1.ApiGroupApp.NetvineApiGroup.ProjectApi
{
//新增项目类型
projectGroup.POST("/insertProjectManager", projectApi.InsertProjectManager)
}
}
func (p *ProjectApi) InsertProjectManager(c *gin.Context) {
...
}
可以通过静态代理的方式增加自定义日志,类似于java注解的方式。通过包装一层函数,通过gin.Context
传递参数,在全局拦截器中获取Context的参数,最终写入数据库
type CustomOperationLog struct {
Module string `json:"user" form:"module"` // 模块名
Detail string `json:"user" form:"detail"` // 操作详情
}
// 包装每个api函数,增加自定义操作记录
func AddRecordWrapper(apiFunc func(ctx *gin.Context), log system.CustomOperationLog) func(ctx *gin.Context) {
return func(ctx *gin.Context) {
ctx.Set("module", log.Module)
ctx.Set("detail", log.Detail)
apiFunc(ctx) // 添加参数后再调用最终api函数
}
}
然后路由注册时改成middleware.AddRecordWrapper(projectApi.InsertProjectManager, system.CustomOperationLog{Module: "产品模块", Detail: "新增项目"})
func (Project *ProjectManagerRouter) InitProjectManagerRouterGroup(Router *gin.RouterGroup) {
projectPrivateGroup := Router.Group("project")
projectGroup := Router.Group("project").Use(middleware.OperationRecord())
projectApi := v1.ApiGroupApp.NetvineApiGroup.ProjectApi
{
//新增项目类型
projectGroup.POST("/insertProjectManager", middleware.AddRecordWrapper(projectApi.InsertProjectManager, system.CustomOperationLog{Module: "产品模块", Detail: "新增项目"}))
}
}
这样就把api方法包装了一层,增加自己的业务逻辑,在全局拦截器处获取参数就行
func OperationRecord() gin.HandlerFunc {
return func(c *gin.Context) {
var body []byte
var userId int
if c.Request.Method != http.MethodGet {
var err error
body, err = ioutil.ReadAll(c.Request.Body)
if err != nil {
global.NETVINE_LOG.Error("read body from request error:", zap.Error(err))
} else {
c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(body))
}
}
c.Next()
latency := time.Since(now)
record.Module = c.GetString("module") // 获取参数
record.Detail = c.GetString("detail") // 获取参数
if err := operationRecordService.CreateSysOperationRecord(record); err != nil {
global.NETVINE_LOG.Error("create operation record error:", zap.Error(err))
}
}
}