diff options
Diffstat (limited to 'device/logger.go')
-rw-r--r-- | device/logger.go | 81 |
1 files changed, 45 insertions, 36 deletions
diff --git a/device/logger.go b/device/logger.go index 3c4d744..6869a24 100644 --- a/device/logger.go +++ b/device/logger.go @@ -6,12 +6,22 @@ package device import ( - "io" - "io/ioutil" "log" "os" ) +// A Logger provides logging for a Device. +// The functions are Printf-style functions. +// They must be safe for concurrent use. +// They do not require a trailing newline in the format. +// If nil, that level of logging will be silent. +type Logger struct { + Debugf func(format string, args ...interface{}) + Infof func(format string, args ...interface{}) + Errorf func(format string, args ...interface{}) +} + +// Log levels for use with NewLogger. const ( LogLevelSilent = iota LogLevelError @@ -19,41 +29,40 @@ const ( LogLevelDebug ) -type Logger struct { - Debug *log.Logger - Info *log.Logger - Error *log.Logger -} - +// NewLogger constructs a Logger that writes to stdout. +// It logs at the specified log level and above. +// It decorates log lines with the log level, date, time, and prepend. func NewLogger(level int, prepend string) *Logger { - output := os.Stdout logger := new(Logger) - - logErr, logInfo, logDebug := func() (io.Writer, io.Writer, io.Writer) { - if level >= LogLevelDebug { - return output, output, output - } - if level >= LogLevelInfo { - return output, output, ioutil.Discard - } - if level >= LogLevelError { - return output, ioutil.Discard, ioutil.Discard - } - return ioutil.Discard, ioutil.Discard, ioutil.Discard - }() - - logger.Debug = log.New(logDebug, - "DEBUG: "+prepend, - log.Ldate|log.Ltime, - ) - - logger.Info = log.New(logInfo, - "INFO: "+prepend, - log.Ldate|log.Ltime, - ) - logger.Error = log.New(logErr, - "ERROR: "+prepend, - log.Ldate|log.Ltime, - ) + logf := func(prefix string) func(string, ...interface{}) { + return log.New(os.Stdout, prefix+": "+prepend, log.Ldate|log.Ltime).Printf + } + if level >= LogLevelDebug { + logger.Debugf = logf("DEBUG") + } + if level >= LogLevelInfo { + logger.Infof = logf("INFO") + } + if level >= LogLevelError { + logger.Errorf = logf("ERROR") + } return logger } + +func (device *Device) debugf(format string, args ...interface{}) { + if device.log.Debugf != nil { + device.log.Debugf(format, args...) + } +} + +func (device *Device) infof(format string, args ...interface{}) { + if device.log.Infof != nil { + device.log.Infof(format, args...) + } +} + +func (device *Device) errorf(format string, args ...interface{}) { + if device.log.Errorf != nil { + device.log.Errorf(format, args...) + } +} |