output.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package logs
  2. import (
  3. "fmt"
  4. . "gateway/common/gatecode"
  5. "gateway/core/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. if err != nil {
  52. // 发送提醒信息
  53. if code.Code() > 2000 && s.Notice != nil {
  54. _ = s.Notice.SendWarnMsg(map[string]interface{}{
  55. "log": contextDetail,
  56. })
  57. }
  58. //是否打印详细错误信息
  59. if s.Config.ServerErrorStack {
  60. if stack := gerror.Stack(err); stack != "" {
  61. contextDetail += "\nStack:\n" + stack
  62. }
  63. }
  64. }
  65. if err == nil && s.Config.ServerAccessLogEnabled { //记录成功
  66. s.accessLog.Printf(r.Context(), contextDetail)
  67. } else if err != nil && s.Config.ServerErrorLogEnabled { //记录异常日志
  68. s.errorLog.Printf(r.Context(), contextDetail)
  69. }
  70. }