diff --git a/pkg/infra/log/log.go b/pkg/infra/log/log.go index ce4062503f3..c10bb3dc77a 100644 --- a/pkg/infra/log/log.go +++ b/pkg/infra/log/log.go @@ -20,6 +20,7 @@ import ( "github.com/go-stack/stack" "github.com/grafana/grafana/pkg/infra/log/level" "github.com/grafana/grafana/pkg/infra/log/term" + "github.com/grafana/grafana/pkg/infra/log/text" "github.com/grafana/grafana/pkg/util" "github.com/mattn/go-isatty" "gopkg.in/ini.v1" @@ -325,11 +326,11 @@ func getLogFormat(format string) Formatedlogger { } } return func(w io.Writer) gokitlog.Logger { - return gokitlog.NewLogfmtLogger(w) + return text.NewTextLogger(w) } case "text": return func(w io.Writer) gokitlog.Logger { - return gokitlog.NewLogfmtLogger(w) + return text.NewTextLogger(w) } case "json": return func(w io.Writer) gokitlog.Logger { @@ -337,7 +338,7 @@ func getLogFormat(format string) Formatedlogger { } default: return func(w io.Writer) gokitlog.Logger { - return gokitlog.NewLogfmtLogger(w) + return text.NewTextLogger(w) } } } diff --git a/pkg/infra/log/text/text_logger.go b/pkg/infra/log/text/text_logger.go new file mode 100644 index 00000000000..ad9891ea511 --- /dev/null +++ b/pkg/infra/log/text/text_logger.go @@ -0,0 +1,39 @@ +package text + +import ( + "encoding" + "fmt" + "io" + "reflect" + + gokitlog "github.com/go-kit/kit/log" +) + +type textLogger struct { + w io.Writer +} + +// NewTextLogger similar to gokitlog.NewLogfmtLogger +// but converts unsupported types to string +func NewTextLogger(w io.Writer) gokitlog.Logger { + return &textLogger{w} +} + +func (l textLogger) Log(keyvals ...interface{}) error { + for i, val := range keyvals { + switch val.(type) { + case nil, string, []byte, encoding.TextMarshaler, error, fmt.Stringer: // supported natively by gokit. + default: + switch reflect.TypeOf(val).Kind() { + case reflect.Array, reflect.Chan, reflect.Func, reflect.Map, reflect.Slice, reflect.Struct: + keyvals[i] = fmt.Sprintf("%+v", val) + default: + } + } + } + ll := gokitlog.NewLogfmtLogger(l.w) + if err := ll.Log(keyvals...); err != nil { + return err + } + return nil +}