package db import ( "context" "time" "go.uber.org/zap" "gorm.io/gorm/logger" "gorm.io/gorm/utils" ) type ZapGormLogger struct { ZapLogger *zap.Logger LogLevel logger.LogLevel SlowThreshold time.Duration } func NewZapGormLogger(zapLogger *zap.Logger) *ZapGormLogger { return &ZapGormLogger{ ZapLogger: zapLogger, LogLevel: logger.Info, SlowThreshold: time.Second, // 1s 慢查询阈值 } } func (l *ZapGormLogger) LogMode(level logger.LogLevel) logger.Interface { newlogger := *l newlogger.LogLevel = level return &newlogger } func (l *ZapGormLogger) Info(ctx context.Context, msg string, data ...interface{}) { if l.LogLevel >= logger.Info { l.ZapLogger.Sugar().Infof(msg, data...) } } func (l *ZapGormLogger) Warn(ctx context.Context, msg string, data ...interface{}) { if l.LogLevel >= logger.Warn { l.ZapLogger.Sugar().Warnf(msg, data...) } } func (l *ZapGormLogger) Error(ctx context.Context, msg string, data ...interface{}) { if l.LogLevel >= logger.Error { l.ZapLogger.Sugar().Errorf(msg, data...) } } func (l *ZapGormLogger) Trace(ctx context.Context, begin time.Time, fc func() (sql string, rowsAffected int64), err error) { if l.LogLevel <= logger.Silent { return } elapsed := time.Since(begin) sql, rows := fc() switch { case err != nil && l.LogLevel >= logger.Error: l.ZapLogger.Error("SQL Error", zap.Error(err), zap.String("sql", sql), zap.Int64("rows", rows), zap.Duration("elapsed", elapsed), zap.String("file", utils.FileWithLineNum()), ) case elapsed > l.SlowThreshold && l.SlowThreshold != 0 && l.LogLevel >= logger.Warn: l.ZapLogger.Warn("Slow SQL", zap.Duration("elapsed", elapsed), zap.String("sql", sql), zap.Int64("rows", rows), zap.String("file", utils.FileWithLineNum()), ) case l.LogLevel >= logger.Info: l.ZapLogger.Info("SQL", zap.String("sql", sql), zap.Int64("rows", rows), zap.Duration("elapsed", elapsed), zap.String("file", utils.FileWithLineNum()), ) } }