package middleware import ( "bytes" "fmt" "io/ioutil" "strings" log "app.yhyue.com/moapp/jylog" "github.com/gogf/gf/v2/errors/gcode" "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/net/ghttp" "github.com/gogf/gf/v2/net/gtrace" "github.com/gogf/gf/v2/os/gtime" "github.com/gogf/gf/v2/util/gconv" "jygit.jydev.jianyu360.cn/dataservice/tripartite_gateway/common/db" . "jygit.jydev.jianyu360.cn/dataservice/tripartite_gateway/common/gatecode" "jygit.jydev.jianyu360.cn/dataservice/tripartite_gateway/core/router" ) // ErrorHandler 统一异常拦截、提醒,及日志打印中间件 func ErrorHandler(r *ghttp.Request, routerManager *router.Manager) { r.Middleware.Next() _, span := gtrace.NewSpan(r.Context(), "ErrorHandler") defer span.End() // 程序异常信息处理 err := r.GetError() if err != nil { gCode := gerror.Code(err) if gCode == gcode.CodeNil { // 非定义异常 gCode = gcode.New(int(GLOBAL_ERR_ERR), GLOBAL_ERR_ERR.String(), err.Error()) } appid := r.GetQuery("appid").String() log.WithContext(r.Context()).Errorln(appid, r.URL.Path, gCode.Code(), gCode.Message(), gCode.Detail()) reqBody, _ := ioutil.ReadAll(r.Body) r.Body = ioutil.NopCloser(bytes.NewReader(reqBody)) error_msg := gCode.Message() log_error_msg := "" if strings.Contains(error_msg, "%s") { error_msg = fmt.Sprintf(error_msg, gCode.Detail()) log_error_msg = error_msg } else { log_error_msg = error_msg if gCode.Detail() != "" { log_error_msg += "," + gconv.String(gCode.Detail()) } } router, rErr := routerManager.GetRouterRule(r.URL.Path) if appid != "" && rErr == nil && router.Price > 0 { header := fmt.Sprintf(`{"timestamp":%s,"sign":"%s"}`, r.GetHeader("timestamp"), r.GetHeader("sign")) var surplus int64 if gCode.Code() == int(GLOBAL_ERR_NOBALANCE) { surplus = gconv.Int64(gCode.Detail()) } db.GateWatMySql.InsertBatch("log", []string{"appid", "url", "header", "param", "price", "surplus", "error_code", "error_msg", "ip", "create_time"}, []interface{}{appid, router.ReqUrl, header, string(reqBody), router.Price, surplus, gCode.Code(), log_error_msg, r.GetClientIp(), gtime.Now().String()}) } //返回固定的友好信息 r.Response.WriteJson(map[string]interface{}{ "error_code": gCode.Code(), "error_msg": error_msg, }) r.Response.ResponseWriter.Flush() } }