2021-12-28 00:49:57 +08:00

72 lines
1.8 KiB
Go

package gormlogrus
import (
"context"
"errors"
"fmt"
"time"
"github.com/sirupsen/logrus"
"gorm.io/gorm"
gormlogger "gorm.io/gorm/logger"
"gorm.io/gorm/utils"
)
type GormLogrusAdapter struct {
SlowThreshold time.Duration
SourceField string
SkipErrRecordNotFound bool
Logger logrus.FieldLogger
}
func New(logger logrus.FieldLogger) *GormLogrusAdapter {
return &GormLogrusAdapter{
Logger: logger,
SkipErrRecordNotFound: false,
SourceField: "gorm",
SlowThreshold: 1 * time.Second,
}
}
func (l *GormLogrusAdapter) LogMode(gormlogger.LogLevel) gormlogger.Interface {
return l
}
func (l *GormLogrusAdapter) Info(ctx context.Context, s string, args ...interface{}) {
l.Logger.Infof(s, args)
}
func (l *GormLogrusAdapter) Warn(ctx context.Context, s string, args ...interface{}) {
logrus.Warnf(s, args)
}
func (l *GormLogrusAdapter) Error(ctx context.Context, s string, args ...interface{}) {
logrus.Errorf(s, args)
}
func (l *GormLogrusAdapter) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) {
elapsed := time.Since(begin)
sql, rowsAffectedNum := fc()
fields := logrus.Fields{}
if l.SourceField != "" {
fields[l.SourceField] = utils.FileWithLineNum()
}
// format := "%s [cost: %s] [rows: %d]"
// args := []interface{}{sql, elapsed, rowsAffectedNum}
msg := fmt.Sprintf("%s [cost: %s] [rows: %d]", sql, elapsed, rowsAffectedNum)
if err != nil && !(errors.Is(err, gorm.ErrRecordNotFound) && l.SkipErrRecordNotFound) {
fields[logrus.ErrorKey] = err
l.Logger.WithFields(fields).Error(msg)
return
}
if l.SlowThreshold != 0 && elapsed > l.SlowThreshold {
l.Logger.WithFields(fields).Warn(msg)
return
}
l.Logger.WithFields(fields).Debug(msg)
}