logger.go (2030B)
1 package viper 2 3 import ( 4 "fmt" 5 6 jww "github.com/spf13/jwalterweatherman" 7 ) 8 9 // Logger is a unified interface for various logging use cases and practices, including: 10 // - leveled logging 11 // - structured logging 12 type Logger interface { 13 // Trace logs a Trace event. 14 // 15 // Even more fine-grained information than Debug events. 16 // Loggers not supporting this level should fall back to Debug. 17 Trace(msg string, keyvals ...interface{}) 18 19 // Debug logs a Debug event. 20 // 21 // A verbose series of information events. 22 // They are useful when debugging the system. 23 Debug(msg string, keyvals ...interface{}) 24 25 // Info logs an Info event. 26 // 27 // General information about what's happening inside the system. 28 Info(msg string, keyvals ...interface{}) 29 30 // Warn logs a Warn(ing) event. 31 // 32 // Non-critical events that should be looked at. 33 Warn(msg string, keyvals ...interface{}) 34 35 // Error logs an Error event. 36 // 37 // Critical events that require immediate attention. 38 // Loggers commonly provide Fatal and Panic levels above Error level, 39 // but exiting and panicing is out of scope for a logging library. 40 Error(msg string, keyvals ...interface{}) 41 } 42 43 type jwwLogger struct{} 44 45 func (jwwLogger) Trace(msg string, keyvals ...interface{}) { 46 jww.TRACE.Printf(jwwLogMessage(msg, keyvals...)) 47 } 48 49 func (jwwLogger) Debug(msg string, keyvals ...interface{}) { 50 jww.DEBUG.Printf(jwwLogMessage(msg, keyvals...)) 51 } 52 53 func (jwwLogger) Info(msg string, keyvals ...interface{}) { 54 jww.INFO.Printf(jwwLogMessage(msg, keyvals...)) 55 } 56 57 func (jwwLogger) Warn(msg string, keyvals ...interface{}) { 58 jww.WARN.Printf(jwwLogMessage(msg, keyvals...)) 59 } 60 61 func (jwwLogger) Error(msg string, keyvals ...interface{}) { 62 jww.ERROR.Printf(jwwLogMessage(msg, keyvals...)) 63 } 64 65 func jwwLogMessage(msg string, keyvals ...interface{}) string { 66 out := msg 67 68 if len(keyvals) > 0 && len(keyvals)%2 == 1 { 69 keyvals = append(keyvals, nil) 70 } 71 72 for i := 0; i <= len(keyvals)-2; i += 2 { 73 out = fmt.Sprintf("%s %v=%v", out, keyvals[i], keyvals[i+1]) 74 } 75 76 return out 77 }