package database import ( "context" "errors" "time" "github.com/emsoft/HospitalPay-Go/internal/pkg/logger" "go.uber.org/zap" "gorm.io/gorm" gormlogger "gorm.io/gorm/logger" ) // 自定义Gorm日志适配器 type GormLogger struct { SlowThreshold time.Duration LogLevel gormlogger.LogLevel } // 创建新的Gorm日志适配器 func NewGormLogger() *GormLogger { return &GormLogger{ SlowThreshold: 200 * time.Millisecond, LogLevel: gormlogger.Info, } } // LogMode 设置日志级别 func (l *GormLogger) LogMode(level gormlogger.LogLevel) gormlogger.Interface { newLogger := *l newLogger.LogLevel = level return &newLogger } // Info 打印信息 func (l *GormLogger) Info(ctx context.Context, msg string, data ...interface{}) { if l.LogLevel >= gormlogger.Info { logger.Infof(msg, data...) } } // Warn 打印警告 func (l *GormLogger) Warn(ctx context.Context, msg string, data ...interface{}) { if l.LogLevel >= gormlogger.Warn { logger.Warnf(msg, data...) } } // Error 打印错误 func (l *GormLogger) Error(ctx context.Context, msg string, data ...interface{}) { if l.LogLevel >= gormlogger.Error { logger.Errorf(msg, data...) } } // Trace 打印SQL func (l *GormLogger) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) { if l.LogLevel <= gormlogger.Silent { return } elapsed := time.Since(begin) sql, rows := fc() fields := []zap.Field{ zap.String("sql", sql), zap.Int64("rows", rows), zap.Duration("elapsed", elapsed), } switch { case err != nil && l.LogLevel >= gormlogger.Error && !errors.Is(err, gorm.ErrRecordNotFound): logger.Error("GORM ERROR", fields...) case elapsed > l.SlowThreshold && l.SlowThreshold != 0 && l.LogLevel >= gormlogger.Warn: logger.Warn("GORM SLOW SQL", fields...) case l.LogLevel >= gormlogger.Info: logger.Debug("GORM SQL", fields...) } }