package internal import ( "context" "fmt" "log" "os" ) // TODO (ned): Revisit logging // Add more standardized approach with log levels and configurability type Logging interface { Printf(ctx context.Context, format string, v ...interface{}) } type DefaultLogger struct { log *log.Logger } func (l *DefaultLogger) Printf(ctx context.Context, format string, v ...interface{}) { _ = l.log.Output(2, fmt.Sprintf(format, v...)) } func NewDefaultLogger() Logging { return &DefaultLogger{ log: log.New(os.Stderr, "redis: ", log.LstdFlags|log.Lshortfile), } } // Logger calls Output to print to the stderr. // Arguments are handled in the manner of fmt.Print. var Logger Logging = NewDefaultLogger() var LogLevel LogLevelT = LogLevelError // LogLevelT represents the logging level type LogLevelT int // Log level constants for the entire go-redis library const ( LogLevelError LogLevelT = iota // 0 - errors only LogLevelWarn // 1 - warnings and errors LogLevelInfo // 2 - info, warnings, and errors LogLevelDebug // 3 - debug, info, warnings, and errors ) // String returns the string representation of the log level func (l LogLevelT) String() string { switch l { case LogLevelError: return "ERROR" case LogLevelWarn: return "WARN" case LogLevelInfo: return "INFO" case LogLevelDebug: return "DEBUG" default: return "UNKNOWN" } } // IsValid returns true if the log level is valid func (l LogLevelT) IsValid() bool { return l >= LogLevelError && l <= LogLevelDebug } func (l LogLevelT) WarnOrAbove() bool { return l >= LogLevelWarn } func (l LogLevelT) InfoOrAbove() bool { return l >= LogLevelInfo } func (l LogLevelT) DebugOrAbove() bool { return l >= LogLevelDebug }