Files
zap_logger/plugins/gorm.go
2025-10-27 16:01:17 +08:00

77 lines
2.0 KiB
Go

package plugins
import (
"context"
"errors"
"fmt"
"time"
"code.mrx.ltd/pkg/zap_logger/log"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
var DefaultGormLogger = NewGormLogger(logger.Config{
SlowThreshold: 2 * time.Second,
Colorful: false,
IgnoreRecordNotFoundError: false,
ParameterizedQueries: false,
LogLevel: logger.Info,
})
type gormLoggerPlugin struct{ logger.Config }
func NewGormLogger(gl logger.Config) *gormLoggerPlugin {
return &gormLoggerPlugin{gl}
}
func (g *gormLoggerPlugin) LogMode(level logger.LogLevel) logger.Interface {
g.LogLevel = level
return g
}
func (g *gormLoggerPlugin) Info(ctx context.Context, msg string, args ...interface{}) {
if g.LogLevel >= logger.Info {
log.Infof(msg, args...)
}
}
func (g *gormLoggerPlugin) Warn(ctx context.Context, msg string, args ...interface{}) {
if g.LogLevel >= logger.Warn {
log.Warnf(msg, args...)
}
}
func (g *gormLoggerPlugin) Error(ctx context.Context, msg string, args ...interface{}) {
if g.LogLevel >= logger.Error {
log.Errorf(msg, args...)
}
}
func (g *gormLoggerPlugin) Trace(ctx context.Context, begin time.Time, fc func() (sql string, rowsAffected int64), err error) {
if g.LogLevel <= logger.Silent {
return
}
sql, rows := fc()
elapsed := time.Since(begin)
msg := fmt.Sprintf("[%v] [rows:%v] %s", elapsed, rows, sql)
if rows == -1 {
msg = fmt.Sprintf("[%v] [rows:%v] %s", elapsed, "-", sql)
}
if elapsed > g.SlowThreshold && g.SlowThreshold != 0 && g.LogLevel >= logger.Warn {
msg = fmt.Sprintf("[SLOW SQL] [%v] [rows:%v] %s", elapsed, rows, sql)
}
switch {
case err != nil && g.LogLevel >= logger.Error && (!errors.Is(err, gorm.ErrRecordNotFound) || !g.IgnoreRecordNotFoundError):
msg = fmt.Sprintf("%s -> %s", err.Error(), msg)
g.Error(ctx, msg)
case elapsed > g.SlowThreshold && g.SlowThreshold != 0 && g.LogLevel >= logger.Warn:
msg = fmt.Sprintf("SLOW SQL -> %s", msg)
g.Warn(ctx, msg)
case g.LogLevel == logger.Info:
g.Info(ctx, msg)
}
}