reqoutput.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package logs
  2. import (
  3. "fmt"
  4. . "gateway/common/gatecode"
  5. "gateway/core/proxy/router"
  6. "github.com/gogf/gf/v2/errors/gerror"
  7. "github.com/gogf/gf/v2/net/ghttp"
  8. "github.com/gogf/gf/v2/os/gtime"
  9. "github.com/gogf/gf/v2/text/gstr"
  10. )
  11. // RecordLogAndNotice 记录请求日志及提醒
  12. func (s *serverLog) RecordLogAndNotice(r *ghttp.Request, err error) {
  13. if !s.Config.ServerAccessLogEnabled && //关闭成功日志
  14. !s.Config.ServerErrorLogEnabled && //关闭错误日志
  15. s.Notice == nil { //关闭消息通知
  16. return
  17. }
  18. handlerCtx := router.GetGContext(r.GetCtx())
  19. //请求时间校验
  20. tookTime := gtime.TimestampMilli() - r.EnterTime
  21. if err == nil {
  22. compareTime := handlerCtx.RouterRule.TimeOut
  23. if compareTime == 0 {
  24. compareTime = s.Config.ServerRequestTimeout
  25. }
  26. if tookTime > compareTime {
  27. err = NewErrorWithCode(SERVER_DETAIL_TIMEOUT, fmt.Sprintf("接口超时: %d>%d", handlerCtx.RouterRule.TimeOut, tookTime))
  28. }
  29. }
  30. var (
  31. scheme = "http"
  32. proto = r.Header.Get("X-Forwarded-Proto")
  33. code = gerror.Code(err)
  34. codeDetail = code.Detail()
  35. codeDetailStr string
  36. )
  37. if r.TLS != nil || gstr.Equal(proto, "https") {
  38. scheme = "https"
  39. }
  40. if codeDetail != nil { //存在错误信息
  41. codeDetailStr = gstr.Replace(fmt.Sprintf(`%+v`, codeDetail), "\n", " ")
  42. } else if err != nil {
  43. codeDetailStr = err.Error()
  44. }
  45. contextDetail := fmt.Sprintf(
  46. `%d %s "%s://%s%s proxy:%s %s" %d ms, %s, "%s", "%s", %d, "%s", "%+v"`,
  47. r.Response.Status, r.Method, scheme, r.Host, r.URL.String(), handlerCtx.ServerAddr, r.Proto,
  48. tookTime, r.GetClientIp(), r.Referer(), r.UserAgent(),
  49. code.Code(), code.Message(), codeDetailStr,
  50. )
  51. // 发送提醒信息
  52. if s.Notice != nil {
  53. _ = s.Notice.SendWarnMsg(map[string]interface{}{
  54. "log": contextDetail,
  55. })
  56. }
  57. if err != nil && s.Config.ServerErrorStack {
  58. if stack := gerror.Stack(err); stack != "" {
  59. contextDetail += "\nStack:\n" + stack
  60. } else {
  61. contextDetail += ", " + err.Error()
  62. }
  63. }
  64. if err == nil && s.Config.ServerAccessLogEnabled { //记录成功
  65. s.accessLog.Printf(r.Context(), contextDetail)
  66. } else if err != nil && s.Config.ServerErrorLogEnabled { //记录异常日志
  67. s.errorLog.Printf(r.Context(), contextDetail)
  68. }
  69. }