add custom gorm log

This commit is contained in:
Yavolte 2025-06-19 11:43:05 +08:00
parent ea09631d4c
commit ea7f75be62
3 changed files with 131 additions and 4 deletions

View File

@ -10,14 +10,20 @@ import (
) )
// Dialer open database // Dialer open database
func Dialer(ctx context.Context, driver string, dsn string) (db *gorm.DB, err error) { func Dialer(ctx context.Context, driver string, dsn string, cbs ...Option) (db *gorm.DB, err error) {
opts := newOptions(cbs...)
if opts.cfg == nil {
opts.cfg = &gorm.Config{}
}
opts.cfg.Logger = newLogger(opts.log)
switch driver { switch driver {
case mysql.DefaultDriverName: case mysql.DefaultDriverName:
db, err = gorm.Open(mysql.Open(dsn)) db, err = gorm.Open(mysql.Open(dsn), opts.cfg)
case sqlite.DriverName: case sqlite.DriverName:
db, err = gorm.Open(sqlite.Open(dsn)) db, err = gorm.Open(sqlite.Open(dsn), opts.cfg)
case "postgres": case "postgres":
db, err = gorm.Open(postgres.Open(dsn)) db, err = gorm.Open(postgres.Open(dsn), opts.cfg)
default: default:
err = gorm.ErrNotImplemented err = gorm.ErrNotImplemented
} }

View File

@ -0,0 +1,83 @@
package dbdialer
import (
"context"
"errors"
"fmt"
"time"
logpkg "git.nobla.cn/golang/aeus/pkg/logger"
"gorm.io/gorm/logger"
"gorm.io/gorm/utils"
)
type Logger struct {
LogLevel logger.LogLevel
SlowThreshold time.Duration
traceStr string
traceErrStr string
logger logpkg.Logger
}
func (lg *Logger) LogMode(level logger.LogLevel) logger.Interface {
lg.LogLevel = level
return lg
}
func (lg *Logger) Info(ctx context.Context, s string, i ...interface{}) {
if lg.LogLevel >= logger.Info {
lg.logger.Info(ctx, s, i...)
}
}
func (lg *Logger) Warn(ctx context.Context, s string, i ...interface{}) {
if lg.LogLevel >= logger.Warn {
lg.logger.Warn(ctx, s, i...)
}
}
func (lg *Logger) Error(ctx context.Context, s string, i ...interface{}) {
if lg.LogLevel >= logger.Error {
lg.logger.Error(ctx, s, i...)
}
}
func (lg *Logger) Trace(ctx context.Context, begin time.Time, fc func() (sql string, rowsAffected int64), err error) {
if lg.LogLevel <= logger.Silent {
return
}
elapsed := time.Since(begin)
switch {
case err != nil && lg.LogLevel >= logger.Error && (!errors.Is(err, logger.ErrRecordNotFound)):
sql, rows := fc()
if rows == -1 {
lg.Warn(ctx, lg.traceErrStr, sql, err, float64(elapsed.Nanoseconds())/1e6, "-", utils.FileWithLineNum())
} else {
lg.Warn(ctx, lg.traceErrStr, sql, err, float64(elapsed.Nanoseconds())/1e6, rows, utils.FileWithLineNum())
}
case elapsed > lg.SlowThreshold && lg.SlowThreshold != 0 && lg.LogLevel >= logger.Warn:
sql, rows := fc()
slowLog := fmt.Sprintf("SLOW SQL >= %v", lg.SlowThreshold)
if rows == -1 {
lg.Warn(ctx, lg.traceErrStr, sql, slowLog, float64(elapsed.Nanoseconds())/1e6, "-", utils.FileWithLineNum())
} else {
lg.Warn(ctx, lg.traceErrStr, sql, slowLog, float64(elapsed.Nanoseconds())/1e6, rows, utils.FileWithLineNum())
}
case lg.LogLevel == logger.Info:
sql, rows := fc()
if rows == -1 {
lg.Info(ctx, lg.traceStr, sql, float64(elapsed.Nanoseconds())/1e6, "-", utils.FileWithLineNum())
} else {
lg.Info(ctx, lg.traceStr, sql, float64(elapsed.Nanoseconds())/1e6, rows, utils.FileWithLineNum())
}
}
}
func newLogger(log logpkg.Logger) *Logger {
return &Logger{
logger: log,
SlowThreshold: time.Second * 10,
traceStr: "%s [%.3fms] [rows:%v] in %s",
traceErrStr: "%s [%s] [%.3fms] [rows:%v] in %s",
}
}

View File

@ -0,0 +1,38 @@
package dbdialer
import (
"git.nobla.cn/golang/aeus/pkg/logger"
"gorm.io/gorm"
)
type (
options struct {
log logger.Logger
cfg *gorm.Config
}
Option func(o *options)
)
func WithConfig(cfg *gorm.Config) Option {
return func(o *options) {
o.cfg = cfg
}
}
func WithLogger(log logger.Logger) Option {
return func(o *options) {
o.log = log
}
}
func newOptions(opts ...Option) *options {
o := &options{
cfg: &gorm.Config{},
log: logger.Default(),
}
for _, opt := range opts {
opt(o)
}
return o
}