From 13bbec408c8d873117a3e673d5b9355087e9db11 Mon Sep 17 00:00:00 2001 From: NishanthSpShetty Date: Sat, 1 May 2021 23:09:47 +0530 Subject: [PATCH 1/4] initial setup for adding zerolog to coldbrew --- loggers/zerolog/zerolog.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 loggers/zerolog/zerolog.go diff --git a/loggers/zerolog/zerolog.go b/loggers/zerolog/zerolog.go new file mode 100644 index 0000000..3056da6 --- /dev/null +++ b/loggers/zerolog/zerolog.go @@ -0,0 +1,25 @@ +package zerolog + +import ( + "context" + + "github.com/go-coldbrew/log/loggers" +) + +type logger struct { +} + +func (l *logger) GetLevel() loggers.Level { + return loggers.DebugLevel +} + +func (l *logger) SetLevel(loggers.Level) { +} + +func (l *logger) Log(ctx context.Context, level loggers.Level, skip int, args ...interface{}) { + +} + +func NewLogger(options ...loggers.Option) loggers.BaseLogger { + return &logger{} +} From 2484eaf4fa73febdb2e1c4e5477d39032831f701 Mon Sep 17 00:00:00 2001 From: NishanthSpShetty Date: Sat, 1 May 2021 23:21:49 +0530 Subject: [PATCH 2/4] Add zerolog as dependency --- go.mod | 2 +- go.sum | 7 +++++++ loggers/zerolog/zerolog.go | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 69b8754..54bd006 100644 --- a/go.mod +++ b/go.mod @@ -9,11 +9,11 @@ require ( github.com/go-stack/stack v1.8.0 // indirect github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect github.com/kr/pretty v0.2.0 // indirect + github.com/rs/zerolog v1.21.0 // indirect github.com/sirupsen/logrus v1.4.2 github.com/stretchr/testify v1.5.1 // indirect go.uber.org/multierr v1.6.0 // indirect go.uber.org/zap v1.16.0 - golang.org/x/tools v0.0.0-20210107193943-4ed967dd8eff // indirect gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect gopkg.in/yaml.v2 v2.3.0 // indirect ) diff --git a/go.sum b/go.sum index 20df83e..d07676f 100644 --- a/go.sum +++ b/go.sum @@ -2,6 +2,7 @@ github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/GandalfUK/godoc2ghmd v0.0.0-20170102215518-d78ed169ffe1 h1:g1/c49W6MT/s9RC/rGM5rkBHbazaOjQO03oSnFjf1DU= github.com/GandalfUK/godoc2ghmd v0.0.0-20170102215518-d78ed169ffe1/go.mod h1:3v/ok4AOWXOhxl3juQtxBtKa0IzHRph5kF8eNrIcDCI= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -26,9 +27,13 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/zerolog v1.21.0 h1:Q3vdXlfLNT+OftyBHsU0Y445MD+8m8axjKgf2si0QcM= +github.com/rs/zerolog v1.21.0/go.mod h1:ZPhntP/xmq1nnND05hhpAh2QMhSsA4UN3MGZ6O2J3hM= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -72,6 +77,7 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -83,6 +89,7 @@ golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20210107193943-4ed967dd8eff h1:6EkB024TP1fu6cmQqeCNw685zYDVt5g8N1BXh755SQM= golang.org/x/tools v0.0.0-20210107193943-4ed967dd8eff/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= diff --git a/loggers/zerolog/zerolog.go b/loggers/zerolog/zerolog.go index 3056da6..7c8cbd8 100644 --- a/loggers/zerolog/zerolog.go +++ b/loggers/zerolog/zerolog.go @@ -14,6 +14,7 @@ func (l *logger) GetLevel() loggers.Level { } func (l *logger) SetLevel(loggers.Level) { + } func (l *logger) Log(ctx context.Context, level loggers.Level, skip int, args ...interface{}) { From 71d9235a3e55e14b167e2ef37f86a494d29eeff5 Mon Sep 17 00:00:00 2001 From: NishanthSpShetty Date: Sun, 2 May 2021 20:43:24 +0530 Subject: [PATCH 3/4] implemented logging functionality with zerolog --- loggers/loggers.go | 3 ++ loggers/zap/zap.go | 5 +-- loggers/zerolog/zerolog.go | 77 ++++++++++++++++++++++++++++++++++++-- 3 files changed, 77 insertions(+), 8 deletions(-) diff --git a/loggers/loggers.go b/loggers/loggers.go index 0605dce..935099b 100644 --- a/loggers/loggers.go +++ b/loggers/loggers.go @@ -9,6 +9,9 @@ import ( "strings" ) +//COLDBREW_CALL_STACK_SIZE number stack frame involved between the logger call from application to zap call. +const COLDBREW_CALL_STACK_SIZE = 3 + // Level type type Level uint32 diff --git a/loggers/zap/zap.go b/loggers/zap/zap.go index f5dbd47..9551e2e 100644 --- a/loggers/zap/zap.go +++ b/loggers/zap/zap.go @@ -15,9 +15,6 @@ type logger struct { cfg zap.Config } -//COLBREW_CALL_STACK_SIZE number stack frame involved between the logger call from application to zap call. -const COLBREW_CALL_STACK_SIZE = 3 - func (l *logger) Log(ctx context.Context, level loggers.Level, skip int, args ...interface{}) { logger := l.logger @@ -110,7 +107,7 @@ func NewLogger(options ...loggers.Option) loggers.BaseLogger { } l, err := zapCfg.Build() - l = l.WithOptions(zap.AddCallerSkip(COLBREW_CALL_STACK_SIZE)) + l = l.WithOptions(zap.AddCallerSkip(loggers.COLBREW_CALL_STACK_SIZE)) if err != nil { //should we fail? will use sugared log here l, _ = zap.NewProduction() diff --git a/loggers/zerolog/zerolog.go b/loggers/zerolog/zerolog.go index 7c8cbd8..220b266 100644 --- a/loggers/zerolog/zerolog.go +++ b/loggers/zerolog/zerolog.go @@ -2,25 +2,94 @@ package zerolog import ( "context" + "os" "github.com/go-coldbrew/log/loggers" + "github.com/rs/zerolog" ) type logger struct { + logger zerolog.Logger + level loggers.Level } func (l *logger) GetLevel() loggers.Level { - return loggers.DebugLevel + return l.level } -func (l *logger) SetLevel(loggers.Level) { - +func (l *logger) SetLevel(level loggers.Level) { + l.logger = l.logger.Level(toZerologLevel(level)) + l.level = level } func (l *logger) Log(ctx context.Context, level loggers.Level, skip int, args ...interface{}) { + logger := l.logger + + var msg string + //if there are odd number of elements in args, first will be treated as a message and rest will + //be key value pair to log in json format + if len(args)%2 != 0 { + msg = args[0].(string) + args = args[1:] + } + + logFunc := logger.Error + switch level { + case loggers.DebugLevel: + logFunc = logger.Debug + case loggers.InfoLevel: + logFunc = logger.Info + case loggers.WarnLevel: + logFunc = logger.Warn + case loggers.ErrorLevel: + logFunc = logger.Error + } + + var logEvent *zerolog.Event = logFunc() + ctxFields := loggers.FromContext(ctx) + if ctxFields != nil { + logEvent = logFunc().Fields(ctxFields) + } + + //log each message field as key value pair from the args + for i := 0; i < len(args); i += 2 { + logEvent = logEvent.Interface(args[i].(string), args[i+1]) + } + + logEvent.Msg(msg) +} + +func toZerologLevel(level loggers.Level) zerolog.Level { + switch level { + case loggers.DebugLevel: + return zerolog.DebugLevel + case loggers.InfoLevel: + return zerolog.InfoLevel + case loggers.WarnLevel: + return zerolog.WarnLevel + case loggers.ErrorLevel: + return zerolog.ErrorLevel + default: + return zerolog.ErrorLevel + } } func NewLogger(options ...loggers.Option) loggers.BaseLogger { - return &logger{} + + opt := loggers.GetDefaultOptions() + // read options + for _, f := range options { + f(&opt) + } + log := zerolog.New(os.Stdout). + With(). + CallerWithSkipFrameCount(loggers.COLDBREW_CALL_STACK_SIZE + 2). + Logger(). + Level(toZerologLevel(opt.Level)) + + return &logger{ + logger: log, + level: opt.Level, + } } From f91ab1b245afb185e31b1e575e842675dce719ce Mon Sep 17 00:00:00 2001 From: NishanthSpShetty Date: Sun, 2 May 2021 20:54:55 +0530 Subject: [PATCH 4/4] set caller and level field name --- loggers/zerolog/zerolog.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/loggers/zerolog/zerolog.go b/loggers/zerolog/zerolog.go index 220b266..2e08166 100644 --- a/loggers/zerolog/zerolog.go +++ b/loggers/zerolog/zerolog.go @@ -82,12 +82,21 @@ func NewLogger(options ...loggers.Option) loggers.BaseLogger { for _, f := range options { f(&opt) } + + zerolog.CallerFieldName = opt.CallerFieldName + zerolog.LevelFieldName = opt.LevelFieldName + log := zerolog.New(os.Stdout). With(). - CallerWithSkipFrameCount(loggers.COLDBREW_CALL_STACK_SIZE + 2). Logger(). Level(toZerologLevel(opt.Level)) + if opt.CallerInfo { + log = log.With(). + CallerWithSkipFrameCount(loggers.COLDBREW_CALL_STACK_SIZE + 2). + Logger() + } + return &logger{ logger: log, level: opt.Level,