package database import ( "context" "time" "go.uber.org/zap" "gorm.io/gorm/logger" ) type GormZapLogger struct { zap *zap.SugaredLogger level logger.LogLevel slowThreshold time.Duration } func NewGormZapLogger(zapLogger *zap.SugaredLogger, level logger.LogLevel) logger.Interface { return &GormZapLogger{ zap: zapLogger, level: level, slowThreshold: 200 * time.Millisecond, } } func (l *GormZapLogger) LogMode(level logger.LogLevel) logger.Interface { l.level = level return l } func (l *GormZapLogger) Info(ctx context.Context, msg string, data ...interface{}) { if l.level >= logger.Info { l.zap.Infof(msg, data...) } } func (l *GormZapLogger) Warn(ctx context.Context, msg string, data ...interface{}) { if l.level >= logger.Warn { l.zap.Warnf(msg, data...) } } func (l *GormZapLogger) Error(ctx context.Context, msg string, data ...interface{}) { if l.level >= logger.Error { l.zap.Errorf(msg, data...) } } func (l *GormZapLogger) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) { elapsed := time.Since(begin) sql, rows := fc() switch { case err != nil && l.level >= logger.Error: l.zap.Errorf("[GORM] err=%v duration=%v rows=%v sql=%s", err, elapsed, rows, sql) case elapsed > l.slowThreshold && l.level >= logger.Warn: l.zap.Warnf("[GORM] slow sql duration=%v rows=%v sql=%s", elapsed, rows, sql) case l.level >= logger.Info: l.zap.Infof("[GORM] duration=%v rows=%v sql=%s", elapsed, rows, sql) } }