// 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) } }