modelRT/logger/gorm_logger.go

62 lines
1.8 KiB
Go

// Package logger define log struct of modelRT project
package logger
import (
"context"
"errors"
"time"
"gorm.io/gorm"
gormLogger "gorm.io/gorm/logger"
)
// GormLogger define struct for implementing gormLogger.Interface
type GormLogger struct {
SlowThreshold time.Duration
}
// NewGormLogger define func for init GormLogger
func NewGormLogger() *GormLogger {
return &GormLogger{
SlowThreshold: 500 * time.Millisecond,
}
}
// LogMode define func for implementing gormLogger.Interface
func (l *GormLogger) LogMode(_ gormLogger.LogLevel) gormLogger.Interface {
return &GormLogger{}
}
// Info define func for implementing gormLogger.Interface
func (l *GormLogger) Info(ctx context.Context, msg string, data ...any) {
Info(ctx, msg, "data", data)
}
// Warn define func for implementing gormLogger.Interface
func (l *GormLogger) Warn(ctx context.Context, msg string, data ...any) {
Warn(ctx, msg, "data", data)
}
// Error define func for implementing gormLogger.Interface
func (l *GormLogger) Error(ctx context.Context, msg string, data ...any) {
Error(ctx, msg, "data", data)
}
// Trace define func for implementing gormLogger.Interface
func (l *GormLogger) Trace(ctx context.Context, begin time.Time, fc func() (sql string, rowsAffected int64), err error) {
// get SQL running time
duration := time.Since(begin).Milliseconds()
// get gorm exec sql and rows affected
sql, rows := fc()
// gorm error judgment
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
Error(ctx, "SQL ERROR", "sql", sql, "rows", rows, "dur(ms)", duration)
}
// slow query judgment
if duration > l.SlowThreshold.Milliseconds() {
Warn(ctx, "SQL SLOW", "sql", sql, "rows", rows, "dur(ms)", duration)
} else {
Debug(ctx, "SQL DEBUG", "sql", sql, "rows", rows, "dur(ms)", duration)
}
}