errorHandler.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package middleware
  2. import (
  3. "bytes"
  4. "fmt"
  5. "io/ioutil"
  6. "strings"
  7. log "app.yhyue.com/moapp/jylog"
  8. "github.com/gogf/gf/v2/errors/gcode"
  9. "github.com/gogf/gf/v2/errors/gerror"
  10. "github.com/gogf/gf/v2/net/ghttp"
  11. "github.com/gogf/gf/v2/net/gtrace"
  12. "github.com/gogf/gf/v2/os/gtime"
  13. "github.com/gogf/gf/v2/util/gconv"
  14. "jygit.jydev.jianyu360.cn/dataservice/tripartite_gateway/common/db"
  15. . "jygit.jydev.jianyu360.cn/dataservice/tripartite_gateway/common/gatecode"
  16. "jygit.jydev.jianyu360.cn/dataservice/tripartite_gateway/core/router"
  17. )
  18. // ErrorHandler 统一异常拦截、提醒,及日志打印中间件
  19. func ErrorHandler(r *ghttp.Request, routerManager *router.Manager) {
  20. r.Middleware.Next()
  21. _, span := gtrace.NewSpan(r.Context(), "ErrorHandler")
  22. defer span.End()
  23. // 程序异常信息处理
  24. err := r.GetError()
  25. if err != nil {
  26. gCode := gerror.Code(err)
  27. if gCode == gcode.CodeNil { // 非定义异常
  28. gCode = gcode.New(int(GLOBAL_ERR_ERR), GLOBAL_ERR_ERR.String(), err.Error())
  29. }
  30. appid := r.GetQuery("appid").String()
  31. log.WithContext(r.Context()).Errorln(appid, r.URL.Path, gCode.Code(), gCode.Message(), gCode.Detail())
  32. reqBody, _ := ioutil.ReadAll(r.Body)
  33. r.Body = ioutil.NopCloser(bytes.NewReader(reqBody))
  34. error_msg := gCode.Message()
  35. log_error_msg := ""
  36. if strings.Contains(error_msg, "%s") {
  37. error_msg = fmt.Sprintf(error_msg, gCode.Detail())
  38. log_error_msg = error_msg
  39. } else {
  40. log_error_msg = error_msg
  41. if gCode.Detail() != "" {
  42. log_error_msg += "," + gconv.String(gCode.Detail())
  43. }
  44. }
  45. router, rErr := routerManager.GetRouterRule(r.URL.Path)
  46. if appid != "" && rErr == nil && router.Price > 0 {
  47. header := fmt.Sprintf(`{"timestamp":%s,"sign":"%s"}`, r.GetHeader("timestamp"), r.GetHeader("sign"))
  48. var surplus int64
  49. if gCode.Code() == int(GLOBAL_ERR_NOBALANCE) {
  50. surplus = gconv.Int64(gCode.Detail())
  51. }
  52. db.GateWatMySql.InsertBatch("thirdparty.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()})
  53. }
  54. //返回固定的友好信息
  55. r.Response.WriteJson(map[string]interface{}{
  56. "error_code": gCode.Code(),
  57. "error_msg": error_msg,
  58. })
  59. r.Response.ResponseWriter.Flush()
  60. }
  61. }