summaryrefslogtreecommitdiff
path: root/device/logger.go
diff options
context:
space:
mode:
Diffstat (limited to 'device/logger.go')
-rw-r--r--device/logger.go81
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...)
+ }
+}