在网上查了很久,现有的资料已经不适配最新的版本
gorm的logger需要实现gorm自己的接口:
Logger logger.Interface
// Interface logger interface type Interface interface { LogMode(LogLevel) Interface Info(context.Context, string, ...interface{}) Warn(context.Context, string, ...interface{}) Error(context.Context, string, ...interface{}) Trace(ctx context.Context, begin time.Time, fc func() (sql string, rowsAffected int64), err error) }
分别是初始化、三种日志级别、和sql追踪
我的代码如下:
logger.go
// gorm使用的logger的初始化
var ( MyGormLogger *GormLogger ) func init() { MyGormLogger = &GormLogger{ logger: logrus.New(), SlowThreshold: 200 * time.Millisecond, } MyGormLogger.logger.SetLevel(logrus.InfoLevel) // 日志输出到文件和控制台 fileGorm, err := os.OpenFile("log/gorm.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) if err != nil { MyGormLogger.logger.Fatal("gorm日志启动失败", err) } MyGormLogger.logger.SetOutput(io.MultiWriter(os.Stdout, fileGorm)) MyGormLogger.logger.SetReportCaller(true) }
// GormLogger Gorm使用的logger type GormLogger struct { logger *logrus.Logger SlowThreshold time.Duration }
// LogMode log mode func (l *GormLogger) LogMode(level gormlogger.LogLevel) gormlogger.Interface { // Set the Logrus log level newLogger := *l switch level { case gormlogger.Silent: newLogger.logger.SetLevel(logrus.PanicLevel) case gormlogger.Error: newLogger.logger.SetLevel(logrus.ErrorLevel) case gormlogger.Warn: newLogger.logger.SetLevel(logrus.WarnLevel) case gormlogger.Info: newLogger.logger.SetLevel(logrus.InfoLevel) default: newLogger.logger.SetLevel(logrus.InfoLevel) } return &newLogger } // Info print info func (l *GormLogger) Info(ctx context.Context, msg string, data ...interface{}) { fileLine := gormUtils.FileWithLineNum() l.logger.Infof("%s "+msg, append([]interface{}{fileLine}, data...)...) } // Warn print warn messages func (l *GormLogger) Warn(ctx context.Context, msg string, data ...interface{}) { fileLine := gormUtils.FileWithLineNum() l.logger.Warnf("%s "+msg, append([]interface{}{fileLine}, data...)...) } // Error print error messages func (l *GormLogger) Error(ctx context.Context, msg string, data ...interface{}) { fileLine := gormUtils.FileWithLineNum() l.logger.Errorf("%s "+msg, append([]interface{}{fileLine}, data...)...) } // Trace print sql message func (l *GormLogger) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) { elapsed := time.Since(begin) sql, rows := fc() if err != nil { l.logger.Errorf("trace: %s, [rows:%d] %s, error: %v", elapsed, rows, sql, err) } else if elapsed > l.SlowThreshold && l.SlowThreshold != 0 { // 慢查询日志 slowLog := fmt.Sprintf("SLOW SQL >= %v", l.SlowThreshold) if rows == -1 { l.logger.Warnf("trace: %s, %s, [rows:-] %s", elapsed, slowLog, sql) } else { l.logger.Warnf("trace: %s, %s, [rows:%d] %s", elapsed, slowLog, rows, sql) } } else { // 普通信息级别日志 l.logger.Infof("trace: %s, [rows:%d] %s", elapsed, rows, sql) } }