logger.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package database
  2. import (
  3. "context"
  4. "time"
  5. "go.uber.org/zap"
  6. "gorm.io/gorm/logger"
  7. )
  8. type GormZapLogger struct {
  9. zap *zap.SugaredLogger
  10. level logger.LogLevel
  11. slowThreshold time.Duration
  12. }
  13. func NewGormZapLogger(zapLogger *zap.SugaredLogger, level logger.LogLevel) logger.Interface {
  14. return &GormZapLogger{
  15. zap: zapLogger,
  16. level: level,
  17. slowThreshold: 200 * time.Millisecond,
  18. }
  19. }
  20. func (l *GormZapLogger) LogMode(level logger.LogLevel) logger.Interface {
  21. l.level = level
  22. return l
  23. }
  24. func (l *GormZapLogger) Info(ctx context.Context, msg string, data ...interface{}) {
  25. if l.level >= logger.Info {
  26. l.zap.Infof(msg, data...)
  27. }
  28. }
  29. func (l *GormZapLogger) Warn(ctx context.Context, msg string, data ...interface{}) {
  30. if l.level >= logger.Warn {
  31. l.zap.Warnf(msg, data...)
  32. }
  33. }
  34. func (l *GormZapLogger) Error(ctx context.Context, msg string, data ...interface{}) {
  35. if l.level >= logger.Error {
  36. l.zap.Errorf(msg, data...)
  37. }
  38. }
  39. func (l *GormZapLogger) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) {
  40. elapsed := time.Since(begin)
  41. sql, rows := fc()
  42. switch {
  43. case err != nil && l.level >= logger.Error:
  44. l.zap.Errorf("[GORM] err=%v duration=%v rows=%v sql=%s", err, elapsed, rows, sql)
  45. case elapsed > l.slowThreshold && l.level >= logger.Warn:
  46. l.zap.Warnf("[GORM] slow sql duration=%v rows=%v sql=%s", elapsed, rows, sql)
  47. case l.level >= logger.Info:
  48. l.zap.Infof("[GORM] duration=%v rows=%v sql=%s", elapsed, rows, sql)
  49. }
  50. }