2024最新-使用logrus作为gorm日志记录器logger
·
在网上查了很久,现有的资料已经不适配最新的版本
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)
}
}
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)