79 lines
1.8 KiB
Go
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...)
|
|
}
|
|
}
|