package logger import ( "context" "errors" log "github.com/sirupsen/logrus" "gorm.io/gorm" gormLogger "gorm.io/gorm/logger" "gorm.io/gorm/utils" "time" ) /* /internal/pkg/logger 该package用于定义和实现日志相关接口 */ //ORM接口的实现 //在所有级别的日志消息中加入默认字段model="gorm" //type GORMFieldHook struct { //} // //func NewGORMFieldHook() (*GORMFieldHook) { // // return &GORMFieldHook{} //} // //func (hook *GORMFieldHook) Fire(entry *log.Entry) error { // entry.Data["model"] = "gorm" // return nil //} type gromLogger struct { logger *log.Logger SlowThreshold time.Duration // 慢 SQL 阈值 SourceField string SkipErrRecordNotFound bool } func NewGormLogger(logger *log.Logger) *gromLogger { return &gromLogger{ logger: logger, SkipErrRecordNotFound: true, } } //实现logger interface中相关接口 func (l *gromLogger) LogMode(gormLogger.LogLevel) gormLogger.Interface { return l } func (l *gromLogger) Info(ctx context.Context, s string, args ...interface{}) { l.logger.WithContext(ctx).Infof(s, args) } func (l *gromLogger) Warn(ctx context.Context, s string, args ...interface{}) { l.logger.WithContext(ctx).Warnf(s, args) } func (l *gromLogger) Error(ctx context.Context, s string, args ...interface{}) { l.logger.WithContext(ctx).Errorf(s, args) } func (l *gromLogger) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) { elapsed := time.Since(begin) sql, _ := fc() fields := log.Fields{} if l.SourceField != "" { fields[l.SourceField] = utils.FileWithLineNum() } if err != nil && !(errors.Is(err, gorm.ErrRecordNotFound) && l.SkipErrRecordNotFound) { fields[log.ErrorKey] = err l.logger.WithContext(ctx).WithFields(fields).Errorf("%s [%s]", sql, elapsed) return } if l.SlowThreshold != 0 && elapsed > l.SlowThreshold { l.logger.WithContext(ctx).WithFields(fields).Warnf("%s [%s]", sql, elapsed) return } l.logger.WithContext(ctx).WithFields(fields).Debugf("%s [%s]", sql, elapsed) }