From cc236202b15b2260c26c0fd6f88a6c8a9dac90e2 Mon Sep 17 00:00:00 2001 From: Taras Postument Date: Fri, 21 Feb 2020 17:52:49 +0200 Subject: [PATCH 1/7] allow to use specific logrus level in the adaptor --- log/logrus/logrus_logger.go | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/log/logrus/logrus_logger.go b/log/logrus/logrus_logger.go index c8a11d569..7a8f5efc6 100644 --- a/log/logrus/logrus_logger.go +++ b/log/logrus/logrus_logger.go @@ -12,13 +12,20 @@ import ( type logrusLogger struct { logrus.FieldLogger + logrus.Level } var errMissingValue = errors.New("(MISSING)") // NewLogrusLogger returns a go-kit log.Logger that sends log events to a Logrus logger. func NewLogrusLogger(logger logrus.FieldLogger) log.Logger { - return &logrusLogger{logger} + return &logrusLogger{logger, logrus.InfoLevel} +} + +// NewLogrusLoggerWithLevel returns a go-kit log.Logger that sends log events to a Logrus logger, which +// will be logged with provided error level +func NewLogrusLoggerWithLevel(logger logrus.FieldLogger, level logrus.Level) log.Logger { + return &logrusLogger{logger, level} } func (l logrusLogger) Log(keyvals ...interface{}) error { @@ -30,6 +37,19 @@ func (l logrusLogger) Log(keyvals ...interface{}) error { fields[fmt.Sprint(keyvals[i])] = errMissingValue } } - l.WithFields(fields).Info() + + switch l.Level { + case logrus.InfoLevel: + l.WithFields(fields).Info() + case logrus.ErrorLevel: + l.WithFields(fields).Error() + case logrus.DebugLevel: + l.WithFields(fields).Debug() + case logrus.WarnLevel: + l.WithFields(fields).Warn() + default: + l.WithFields(fields).Print() + } + return nil } From c8e784125c34bf923842035e0116c1d8b8c9db8d Mon Sep 17 00:00:00 2001 From: Taras Postument Date: Fri, 21 Feb 2020 18:42:18 +0200 Subject: [PATCH 2/7] set logrus level using the option function approach --- log/logrus/logrus_logger.go | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/log/logrus/logrus_logger.go b/log/logrus/logrus_logger.go index 7a8f5efc6..d00e7fb63 100644 --- a/log/logrus/logrus_logger.go +++ b/log/logrus/logrus_logger.go @@ -14,18 +14,30 @@ type logrusLogger struct { logrus.FieldLogger logrus.Level } +type option func(*logrusLogger) var errMissingValue = errors.New("(MISSING)") // NewLogrusLogger returns a go-kit log.Logger that sends log events to a Logrus logger. -func NewLogrusLogger(logger logrus.FieldLogger) log.Logger { - return &logrusLogger{logger, logrus.InfoLevel} +func NewLogrusLogger(logger logrus.FieldLogger, options ...option) log.Logger { + l := &logrusLogger{ + FieldLogger: logger, + Level: logrus.InfoLevel, + } + + for _, optFunc := range options { + optFunc(l) + } + + return l } -// NewLogrusLoggerWithLevel returns a go-kit log.Logger that sends log events to a Logrus logger, which -// will be logged with provided error level -func NewLogrusLoggerWithLevel(logger logrus.FieldLogger, level logrus.Level) log.Logger { - return &logrusLogger{logger, level} +// WithLevel allows to set specific log level +// to log messages with +func WithLevel(level logrus.Level) option { + return func(c *logrusLogger) { + c.Level = level + } } func (l logrusLogger) Log(keyvals ...interface{}) error { From fb6b3fac5ae80da72ae3564f6f4306dc7017dc80 Mon Sep 17 00:00:00 2001 From: Taras Postument Date: Mon, 24 Feb 2020 16:28:17 +0200 Subject: [PATCH 3/7] Make Option exported, rename logrusLogger just to Logger --- log/logrus/logrus_logger.go | 21 +++++++++++---------- log/logrus/logrus_logger_test.go | 2 +- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/log/logrus/logrus_logger.go b/log/logrus/logrus_logger.go index d00e7fb63..00ae6b2e3 100644 --- a/log/logrus/logrus_logger.go +++ b/log/logrus/logrus_logger.go @@ -10,17 +10,18 @@ import ( "github.com/sirupsen/logrus" ) -type logrusLogger struct { +type Logger struct { logrus.FieldLogger logrus.Level } -type option func(*logrusLogger) + +type Option func(*Logger) var errMissingValue = errors.New("(MISSING)") -// NewLogrusLogger returns a go-kit log.Logger that sends log events to a Logrus logger. -func NewLogrusLogger(logger logrus.FieldLogger, options ...option) log.Logger { - l := &logrusLogger{ +// NewLogger returns a go-kit log.Logger that sends log events to a Logrus logger. +func NewLogger(logger logrus.FieldLogger, options ...Option) log.Logger { + l := &Logger{ FieldLogger: logger, Level: logrus.InfoLevel, } @@ -32,15 +33,15 @@ func NewLogrusLogger(logger logrus.FieldLogger, options ...option) log.Logger { return l } -// WithLevel allows to set specific log level -// to log messages with -func WithLevel(level logrus.Level) option { - return func(c *logrusLogger) { +// WithLevel configures a logrus logger to set specific log +// level to log messages with +func WithLevel(level logrus.Level) Option { + return func(c *Logger) { c.Level = level } } -func (l logrusLogger) Log(keyvals ...interface{}) error { +func (l Logger) Log(keyvals ...interface{}) error { fields := logrus.Fields{} for i := 0; i < len(keyvals); i += 2 { if i+1 < len(keyvals) { diff --git a/log/logrus/logrus_logger_test.go b/log/logrus/logrus_logger_test.go index cc656ce0f..38efb132f 100644 --- a/log/logrus/logrus_logger_test.go +++ b/log/logrus/logrus_logger_test.go @@ -16,7 +16,7 @@ func TestLogrusLogger(t *testing.T) { logrusLogger := logrus.New() logrusLogger.Out = buf logrusLogger.Formatter = &logrus.TextFormatter{TimestampFormat: "02-01-2006 15:04:05", FullTimestamp: true} - logger := log.NewLogrusLogger(logrusLogger) + logger := log.NewLogger(logrusLogger) if err := logger.Log("hello", "world"); err != nil { t.Fatal(err) From 9368a66e69bd725a56c5d3578b4d2883982058fa Mon Sep 17 00:00:00 2001 From: Taras Postument Date: Mon, 24 Feb 2020 18:17:16 +0200 Subject: [PATCH 4/7] add tests for the WithLevel feature --- log/logrus/logrus_logger.go | 5 ++- log/logrus/logrus_logger_test.go | 65 ++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 2 deletions(-) diff --git a/log/logrus/logrus_logger.go b/log/logrus/logrus_logger.go index 00ae6b2e3..fb7fd4a67 100644 --- a/log/logrus/logrus_logger.go +++ b/log/logrus/logrus_logger.go @@ -33,8 +33,7 @@ func NewLogger(logger logrus.FieldLogger, options ...Option) log.Logger { return l } -// WithLevel configures a logrus logger to set specific log -// level to log messages with +// WithLevel configures a logrus logger to log at level for all events. func WithLevel(level logrus.Level) Option { return func(c *Logger) { c.Level = level @@ -60,6 +59,8 @@ func (l Logger) Log(keyvals ...interface{}) error { l.WithFields(fields).Debug() case logrus.WarnLevel: l.WithFields(fields).Warn() + case logrus.TraceLevel: + l.WithFields(fields).Trace() default: l.WithFields(fields).Print() } diff --git a/log/logrus/logrus_logger_test.go b/log/logrus/logrus_logger_test.go index 38efb132f..5dcce06a0 100644 --- a/log/logrus/logrus_logger_test.go +++ b/log/logrus/logrus_logger_test.go @@ -2,9 +2,11 @@ package logrus_test import ( "bytes" + "encoding/json" "errors" "strings" "testing" + "time" log "github.com/go-kit/kit/log/logrus" "github.com/sirupsen/logrus" @@ -53,3 +55,66 @@ func TestLogrusLogger(t *testing.T) { type mymap map[int]int func (m mymap) String() string { return "special_behavior" } + +func TestWithLevel(t *testing.T) { + tests := []struct { + name string + level logrus.Level + expectedLevel logrus.Level + }{ + { + name: "Test Debug level", + level: logrus.DebugLevel, + expectedLevel: logrus.DebugLevel, + }, + { + name: "Test Error level", + level: logrus.ErrorLevel, + expectedLevel: logrus.ErrorLevel, + }, + { + name: "Test Warn level", + level: logrus.WarnLevel, + expectedLevel: logrus.WarnLevel, + }, + { + name: "Test Info level", + level: logrus.InfoLevel, + expectedLevel: logrus.InfoLevel, + }, + { + name: "Test Trace level", + level: logrus.TraceLevel, + expectedLevel: logrus.TraceLevel, + }, + { + name: "Test not existing level", + level: 999, + expectedLevel: logrus.InfoLevel, + }, + } + for _, tt := range tests { + buf := &bytes.Buffer{} + logrusLogger := logrus.New() + logrusLogger.Out = buf + logrusLogger.Level = tt.level + logrusLogger.Formatter = &logrus.JSONFormatter{} + logger := log.NewLogger(logrusLogger, log.WithLevel(tt.level)) + + t.Run(tt.name, func(t *testing.T) { + if err := logger.Log(time.Now().String(), "amazing", "tests"); err != nil { + t.Fatal(err) + } + + l := map[string]interface{}{} + if err := json.Unmarshal(buf.Bytes(), &l); err != nil { + t.Fatal(err) + } + + if v, ok := l["level"].(string); !ok || v != tt.expectedLevel.String() { + t.Fatalf("Logging levels doesn't match. Expected: %s, got: %s", tt.level, v) + } + + }) + } +} From d9bb21b5adac9bde56fdfa7f162d0d8f8210e44a Mon Sep 17 00:00:00 2001 From: Taras Postument Date: Thu, 27 Feb 2020 10:32:32 +0200 Subject: [PATCH 5/7] remove unnecessary log keys --- log/logrus/logrus_logger_test.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/log/logrus/logrus_logger_test.go b/log/logrus/logrus_logger_test.go index 5dcce06a0..cc6818437 100644 --- a/log/logrus/logrus_logger_test.go +++ b/log/logrus/logrus_logger_test.go @@ -6,7 +6,6 @@ import ( "errors" "strings" "testing" - "time" log "github.com/go-kit/kit/log/logrus" "github.com/sirupsen/logrus" @@ -102,7 +101,7 @@ func TestWithLevel(t *testing.T) { logger := log.NewLogger(logrusLogger, log.WithLevel(tt.level)) t.Run(tt.name, func(t *testing.T) { - if err := logger.Log(time.Now().String(), "amazing", "tests"); err != nil { + if err := logger.Log(); err != nil { t.Fatal(err) } From 5ae12b60dc8ecad239f500b3ef13df5fa841019b Mon Sep 17 00:00:00 2001 From: Taras Postument Date: Mon, 9 Mar 2020 23:36:03 +0200 Subject: [PATCH 6/7] make logrus logger fields unexported --- log/logrus/logrus_logger.go | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/log/logrus/logrus_logger.go b/log/logrus/logrus_logger.go index fb7fd4a67..93e7f738d 100644 --- a/log/logrus/logrus_logger.go +++ b/log/logrus/logrus_logger.go @@ -11,8 +11,8 @@ import ( ) type Logger struct { - logrus.FieldLogger - logrus.Level + field logrus.FieldLogger + level logrus.Level } type Option func(*Logger) @@ -22,8 +22,8 @@ var errMissingValue = errors.New("(MISSING)") // NewLogger returns a go-kit log.Logger that sends log events to a Logrus logger. func NewLogger(logger logrus.FieldLogger, options ...Option) log.Logger { l := &Logger{ - FieldLogger: logger, - Level: logrus.InfoLevel, + field: logger, + level: logrus.InfoLevel, } for _, optFunc := range options { @@ -36,7 +36,7 @@ func NewLogger(logger logrus.FieldLogger, options ...Option) log.Logger { // WithLevel configures a logrus logger to log at level for all events. func WithLevel(level logrus.Level) Option { return func(c *Logger) { - c.Level = level + c.level = level } } @@ -50,19 +50,19 @@ func (l Logger) Log(keyvals ...interface{}) error { } } - switch l.Level { + switch l.level { case logrus.InfoLevel: - l.WithFields(fields).Info() + l.field.WithFields(fields).Info() case logrus.ErrorLevel: - l.WithFields(fields).Error() + l.field.WithFields(fields).Error() case logrus.DebugLevel: - l.WithFields(fields).Debug() + l.field.WithFields(fields).Debug() case logrus.WarnLevel: - l.WithFields(fields).Warn() + l.field.WithFields(fields).Warn() case logrus.TraceLevel: - l.WithFields(fields).Trace() + l.field.WithFields(fields).Trace() default: - l.WithFields(fields).Print() + l.field.WithFields(fields).Print() } return nil From 0b4e97f161830e455a36c13368e5a330d1e5d76f Mon Sep 17 00:00:00 2001 From: Taras Postument Date: Mon, 9 Mar 2020 23:37:17 +0200 Subject: [PATCH 7/7] update NewLogger comment --- log/logrus/logrus_logger.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/log/logrus/logrus_logger.go b/log/logrus/logrus_logger.go index 93e7f738d..a5dc9ca47 100644 --- a/log/logrus/logrus_logger.go +++ b/log/logrus/logrus_logger.go @@ -19,7 +19,7 @@ type Option func(*Logger) var errMissingValue = errors.New("(MISSING)") -// NewLogger returns a go-kit log.Logger that sends log events to a Logrus logger. +// NewLogger returns a Go kit log.Logger that sends log events to a logrus.Logger. func NewLogger(logger logrus.FieldLogger, options ...Option) log.Logger { l := &Logger{ field: logger,