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  }