package main import ( "io" "log" ) // Loglevel is used to set the current loglevel of Logger. type Loglevel int const ( // NONE is a loglevel for Logger. NONE Loglevel = 0 // ERROR is a loglevel for Logger. ERROR Loglevel = 1 // WARN is a loglevel for Logger. WARN Loglevel = 2 // INFO is a loglevel for Logger. INFO Loglevel = 3 // DEBUG is a loglevel for Logger. DEBUG Loglevel = 4 ) // Logger uses multiple instances of log.Logger to provide logging methods for multiple loglevels. type Logger struct { debug *log.Logger info *log.Logger warn *log.Logger error *log.Logger logDebug bool logInfo bool logWarn bool logError bool } // NewLogger prepares a new instance of Logger for custom use. func NewLogger(stdOut io.Writer, stdErr io.Writer, logLevel Loglevel) Logger { newLogger := Logger{} newLogger.debug = log.New(stdOut, "DEBUG ", 0) newLogger.info = log.New(stdOut, "INFO ", 0) newLogger.warn = log.New(stdErr, "WARN ", 0) newLogger.error = log.New(stdErr, "ERROR ", 0) newLogger.SetLogLevel(logLevel) return newLogger } // SetLogLevel can be used to change the loglevel of Logger on the fly. func (l *Logger) SetLogLevel(logLevel Loglevel) { l.logDebug = (logLevel >= DEBUG) l.logInfo = (logLevel >= INFO) l.logWarn = (logLevel >= WARN) l.logError = (logLevel >= ERROR) } // Debug is an alias for log.Logger.Print() with severity DEBUG. func (l *Logger) Debug(v ...interface{}) { if l.logDebug { l.debug.Print(v...) } } // Debugln is an alias for log.Logger.Println() with severity DEBUG. func (l *Logger) Debugln(v ...interface{}) { if l.logDebug { l.debug.Println(v...) } } // Debugf is an alias for log.Logger.Printf() with severity DEBUG. func (l *Logger) Debugf(format string, v ...interface{}) { if l.logDebug { l.debug.Printf(format, v...) } } // Info is an alias for log.Logger.Print() with severity INFO. func (l *Logger) Info(v ...interface{}) { if l.logInfo { l.info.Print(v...) } } // Infoln is an alias for log.Logger.Println() with severity INFO. func (l *Logger) Infoln(v ...interface{}) { if l.logInfo { l.info.Println(v...) } } // Infof is an alias for log.Logger.Printf() with severity INFO. func (l *Logger) Infof(format string, v ...interface{}) { if l.logInfo { l.info.Printf(format, v...) } } // Warn is an alias for log.Logger.Print() with severity WARN. func (l *Logger) Warn(v ...interface{}) { if l.logWarn { l.warn.Print(v...) } } // Warnln is an alias for log.Logger.Println() with severity WARN. func (l *Logger) Warnln(v ...interface{}) { if l.logWarn { l.warn.Println(v...) } } // Warnf is an alias for log.Logger.Printf() with severity WARN. func (l *Logger) Warnf(format string, v ...interface{}) { if l.logWarn { l.warn.Printf(format, v...) } } // Error is an alias for log.Logger.Print() with severity ERROR. func (l *Logger) Error(v ...interface{}) { if l.logError { l.error.Print(v...) } } // Errorln is an alias for log.Logger.Println() with severity ERROR. func (l *Logger) Errorln(v ...interface{}) { if l.logError { l.error.Println(v...) } } // Errorf is an alias for log.Logger.Printf() with severity ERROR. func (l *Logger) Errorf(format string, v ...interface{}) { if l.logError { l.error.Printf(format, v...) } }