github.com/weaveworks/common@v0.0.0-20230728070032-dd9e68f319d5/logging/gokit.go (about) 1 package logging 2 3 import ( 4 "fmt" 5 "os" 6 7 "github.com/go-kit/log" 8 "github.com/go-kit/log/level" 9 ) 10 11 // NewGoKitFormat creates a new Interface backed by a GoKit logger 12 // format can be "json" or defaults to logfmt 13 func NewGoKitFormat(l Level, f Format) Interface { 14 var logger log.Logger 15 if f.s == "json" { 16 logger = log.NewJSONLogger(log.NewSyncWriter(os.Stderr)) 17 } else { 18 logger = log.NewLogfmtLogger(log.NewSyncWriter(os.Stderr)) 19 } 20 return addStandardFields(logger, l) 21 } 22 23 // stand-alone for test purposes 24 func addStandardFields(logger log.Logger, l Level) Interface { 25 logger = log.With(logger, "ts", log.DefaultTimestampUTC, "caller", log.Caller(5)) 26 logger = level.NewFilter(logger, l.Gokit) 27 return gokit{logger} 28 } 29 30 // NewGoKit creates a new Interface backed by a GoKit logger 31 func NewGoKit(l Level) Interface { 32 return NewGoKitFormat(l, Format{s: "logfmt"}) 33 } 34 35 // GoKit wraps an existing gokit Logger. 36 func GoKit(logger log.Logger) Interface { 37 return gokit{logger} 38 } 39 40 type gokit struct { 41 log.Logger 42 } 43 44 // Helper to defer sprintf until it is needed. 45 type sprintf struct { 46 format string 47 args []interface{} 48 } 49 50 func (s *sprintf) String() string { 51 return fmt.Sprintf(s.format, s.args...) 52 } 53 54 // Helper to defer sprint until it is needed. 55 // Note we don't use Sprintln because the output is passed to go-kit as one value among many on a line 56 type sprint struct { 57 args []interface{} 58 } 59 60 func (s *sprint) String() string { 61 return fmt.Sprint(s.args...) 62 } 63 64 func (g gokit) Debugf(format string, args ...interface{}) { 65 level.Debug(g.Logger).Log("msg", &sprintf{format: format, args: args}) 66 } 67 func (g gokit) Debugln(args ...interface{}) { 68 level.Debug(g.Logger).Log("msg", &sprint{args: args}) 69 } 70 71 func (g gokit) Infof(format string, args ...interface{}) { 72 level.Info(g.Logger).Log("msg", &sprintf{format: format, args: args}) 73 } 74 func (g gokit) Infoln(args ...interface{}) { 75 level.Info(g.Logger).Log("msg", &sprint{args: args}) 76 } 77 78 func (g gokit) Warnf(format string, args ...interface{}) { 79 level.Warn(g.Logger).Log("msg", &sprintf{format: format, args: args}) 80 } 81 func (g gokit) Warnln(args ...interface{}) { 82 level.Warn(g.Logger).Log("msg", &sprint{args: args}) 83 } 84 85 func (g gokit) Errorf(format string, args ...interface{}) { 86 level.Error(g.Logger).Log("msg", &sprintf{format: format, args: args}) 87 } 88 func (g gokit) Errorln(args ...interface{}) { 89 level.Error(g.Logger).Log("msg", &sprint{args: args}) 90 } 91 92 func (g gokit) WithField(key string, value interface{}) Interface { 93 return gokit{log.With(g.Logger, key, value)} 94 } 95 96 func (g gokit) WithFields(fields Fields) Interface { 97 logger := g.Logger 98 for k, v := range fields { 99 logger = log.With(logger, k, v) 100 } 101 return gokit{logger} 102 }