logger.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package logger
  2. import (
  3. "context"
  4. "errors"
  5. log "github.com/sirupsen/logrus"
  6. "gorm.io/gorm"
  7. gormLogger "gorm.io/gorm/logger"
  8. "gorm.io/gorm/utils"
  9. "time"
  10. )
  11. /*
  12. /internal/pkg/logger
  13. 该package用于定义和实现日志相关接口
  14. */
  15. //ORM接口的实现
  16. //在所有级别的日志消息中加入默认字段model="gorm"
  17. //type GORMFieldHook struct {
  18. //}
  19. //
  20. //func NewGORMFieldHook() (*GORMFieldHook) {
  21. //
  22. // return &GORMFieldHook{}
  23. //}
  24. //
  25. //func (hook *GORMFieldHook) Fire(entry *log.Entry) error {
  26. // entry.Data["model"] = "gorm"
  27. // return nil
  28. //}
  29. type gromLogger struct {
  30. logger *log.Logger
  31. SlowThreshold time.Duration // 慢 SQL 阈值
  32. SourceField string
  33. SkipErrRecordNotFound bool
  34. }
  35. func NewGormLogger(logger *log.Logger) *gromLogger {
  36. return &gromLogger{
  37. logger: logger,
  38. SkipErrRecordNotFound: true,
  39. }
  40. }
  41. //实现logger interface中相关接口
  42. func (l *gromLogger) LogMode(gormLogger.LogLevel) gormLogger.Interface {
  43. return l
  44. }
  45. func (l *gromLogger) Info(ctx context.Context, s string, args ...interface{}) {
  46. l.logger.WithContext(ctx).Infof(s, args)
  47. }
  48. func (l *gromLogger) Warn(ctx context.Context, s string, args ...interface{}) {
  49. l.logger.WithContext(ctx).Warnf(s, args)
  50. }
  51. func (l *gromLogger) Error(ctx context.Context, s string, args ...interface{}) {
  52. l.logger.WithContext(ctx).Errorf(s, args)
  53. }
  54. func (l *gromLogger) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) {
  55. elapsed := time.Since(begin)
  56. sql, _ := fc()
  57. fields := log.Fields{}
  58. if l.SourceField != "" {
  59. fields[l.SourceField] = utils.FileWithLineNum()
  60. }
  61. if err != nil && !(errors.Is(err, gorm.ErrRecordNotFound) && l.SkipErrRecordNotFound) {
  62. fields[log.ErrorKey] = err
  63. l.logger.WithContext(ctx).WithFields(fields).Errorf("%s [%s]", sql, elapsed)
  64. return
  65. }
  66. if l.SlowThreshold != 0 && elapsed > l.SlowThreshold {
  67. l.logger.WithContext(ctx).WithFields(fields).Warnf("%s [%s]", sql, elapsed)
  68. return
  69. }
  70. l.logger.WithContext(ctx).WithFields(fields).Debugf("%s [%s]", sql, elapsed)
  71. }