oss/logger.go (103 lines of code) (raw):

package oss import ( "fmt" "log" "strings" ) // A LogPrinter is a interface for the SDK to log messages to. type LogPrinter interface { Print(...any) } // A LogPrinterFunc is a convenience type to wrap it so the LogPrinter interface can be used. type LogPrinterFunc func(...any) // Print calls the wrapped function with the arguments provided func (f LogPrinterFunc) Print(v ...any) { f(v...) } // Define the level of the output log const ( LogOff = iota LogError LogWarn LogInfo LogDebug ) var logLevelTag = []string{"", "ERROR ", "WARNING ", "INFO ", "DEBUG "} // Logger interface to handle logging type Logger interface { Debugf(format string, v ...any) Infof(format string, v ...any) Warnf(format string, v ...any) Errorf(format string, v ...any) Level() int } type nopLogger struct { } func (*nopLogger) Debugf(_ string, _ ...any) {} func (*nopLogger) Infof(_ string, _ ...any) {} func (*nopLogger) Warnf(_ string, _ ...any) {} func (*nopLogger) Errorf(_ string, _ ...any) {} func (*nopLogger) Level() int { return LogOff } // NewLogger returns a Logger func NewLogger(level int, printer LogPrinter) Logger { if level <= LogOff { return &nopLogger{} } if printer == nil { printer = LogPrinterFunc(func(v ...any) { log.Print(v...) }) } return &standardLogger{ level: level, printer: printer, } } type standardLogger struct { level int printer LogPrinter } func (l *standardLogger) printf(level int, format string, v ...any) { if l.printer == nil { return } l.printer.Print(logLevelTag[level], fmt.Sprintf(format, v...)) } func (l *standardLogger) Debugf(format string, v ...any) { if l.level < LogDebug { return } l.printf(LogDebug, format, v...) } func (l *standardLogger) Infof(format string, v ...any) { if l.level < LogInfo { return } l.printf(LogInfo, format, v...) } func (l *standardLogger) Warnf(format string, v ...any) { if l.level < LogWarn { return } l.printf(LogWarn, format, v...) } func (l *standardLogger) Errorf(format string, v ...any) { if l.level < LogError { return } l.printf(LogError, format, v...) } func (l *standardLogger) Level() int { return l.level } func ToLogLevel(s string) int { s = strings.ToLower(s) switch s { case "error", "err": return LogError case "warning", "warn": return LogWarn case "info": return LogInfo case "debug", "dbg": return LogDebug default: return LogOff } } var _ Logger = (*nopLogger)(nil) var _ Logger = (*standardLogger)(nil)