output.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package logs
  2. import (
  3. . "bp.jydev.jianyu360.cn/BaseService/gateway/common/gatecode"
  4. "bp.jydev.jianyu360.cn/BaseService/gateway/core/router"
  5. "fmt"
  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.Config.ServerRequestLogSaveDb && //关闭保存数据库日志
  16. s.Notice == nil { //关闭消息通知
  17. return
  18. }
  19. handlerCtx := router.GetGContext(r.GetCtx())
  20. //请求时间校验
  21. tookTime := gtime.TimestampMilli() - r.EnterTime
  22. if err == nil {
  23. compareTime := handlerCtx.RouterRule.TimeOut
  24. if compareTime == 0 {
  25. compareTime = s.Config.ServerRequestTimeout
  26. }
  27. if tookTime > compareTime {
  28. err = NewErrorWithCode(SERVER_DETAIL_TIMEOUT, fmt.Sprintf("接口超时: %d>%d", handlerCtx.RouterRule.TimeOut, tookTime))
  29. }
  30. }
  31. var (
  32. scheme = "http"
  33. proto = r.Header.Get("X-Forwarded-Proto")
  34. code = gerror.Code(err)
  35. codeDetail = code.Detail()
  36. codeDetailStr string
  37. )
  38. if r.TLS != nil || gstr.Equal(proto, "https") {
  39. scheme = "https"
  40. }
  41. if codeDetail != nil { //存在错误信息
  42. codeDetailStr = gstr.Replace(fmt.Sprintf(`%+v`, codeDetail), "\n", " ")
  43. } else if err != nil {
  44. codeDetailStr = err.Error()
  45. }
  46. contextDetail := fmt.Sprintf(
  47. `%d %s "%s://%s%s proxy:%s %s" %d ms, %s, "%s", "%s", %d, "%s", "%+v"`,
  48. r.Response.Status, r.Method, scheme, r.Host, r.URL.String(), handlerCtx.ServerAddr, r.Proto,
  49. tookTime, r.GetClientIp(), r.Referer(), r.UserAgent(),
  50. code.Code(), code.Message(), codeDetailStr,
  51. )
  52. if err != nil {
  53. // 发送提醒信息
  54. if code.Code() > 2000 && s.Notice != nil {
  55. _ = s.Notice.SendWarnMsg(map[string]interface{}{
  56. "log": contextDetail,
  57. })
  58. }
  59. //是否打印详细错误信息
  60. if s.Config.ServerErrorStack {
  61. if stack := gerror.Stack(err); stack != "" {
  62. contextDetail += "\nStack:\n" + stack
  63. }
  64. }
  65. }
  66. if s.Config.ServerRequestLogSaveDb {
  67. s.saveLogToDb(handlerCtx, r)
  68. }
  69. if err == nil && s.Config.ServerAccessLogEnabled { //记录成功
  70. s.accessLog.Printf(r.Context(), contextDetail)
  71. } else if err != nil && s.Config.ServerErrorLogEnabled { //记录异常日志
  72. s.errorLog.Printf(r.Context(), contextDetail)
  73. }
  74. }