// Package logger define log struct of modelRT project package logger import ( "context" "errors" "fmt" "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, fmt.Sprintf(msg, data...)) } // Warn define func for implementing gormLogger.Interface func (l *GormLogger) Warn(ctx context.Context, msg string, data ...any) { Warn(ctx, fmt.Sprintf(msg, data...)) } // Error define func for implementing gormLogger.Interface func (l *GormLogger) Error(ctx context.Context, msg string, data ...any) { Error(ctx, fmt.Sprintf(msg, 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() if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { ErrorSkip(ctx, 1, "SQL ERROR", "sql", sql, "rows", rows, "dur(ms)", duration) return } if duration > l.SlowThreshold.Milliseconds() { WarnSkip(ctx, 1, "SQL SLOW", "sql", sql, "rows", rows, "dur(ms)", duration) } else { InfoSkip(ctx, 1, "SQL INFO", "sql", sql, "rows", rows, "dur(ms)", duration) } }