2025-05-28 16:19:21 +08:00

79 lines
1.8 KiB
Go

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...)
}
}