From 73942fe95277dee2ccc45ccb28cc64fc7536d3a3 Mon Sep 17 00:00:00 2001 From: Keepers Date: Thu, 4 Aug 2022 17:28:26 -0600 Subject: [PATCH] fix up logger specs (#489) --- src/internal/connector/support/status_test.go | 22 +++-- src/pkg/logger/logger.go | 91 +++++++++++++------ 2 files changed, 81 insertions(+), 32 deletions(-) diff --git a/src/internal/connector/support/status_test.go b/src/internal/connector/support/status_test.go index 26812533f..a0716437f 100644 --- a/src/internal/connector/support/status_test.go +++ b/src/internal/connector/support/status_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" ) @@ -43,12 +44,6 @@ func (suite *GCStatusTestSuite) TestCreateStatus() { params: statusParams{Restore, 12, 9, 8, WrapAndAppend("tres", errors.New("three"), WrapAndAppend("arc376", errors.New("one"), errors.New("two")))}, expect: assert.True, }, - { - name: "Invalid status", - // todo: expect panic once logger.DPanicw identifies dev mode. - params: statusParams{Backup, 9, 3, 13, errors.New("invalidcl")}, - expect: assert.True, - }, } for _, test := range table { suite.T().Run(test.name, func(t *testing.T) { @@ -64,3 +59,18 @@ func (suite *GCStatusTestSuite) TestCreateStatus() { } } + +func (suite *GCStatusTestSuite) TestCreateStatus_InvalidStatus() { + t := suite.T() + params := statusParams{Backup, 9, 3, 13, errors.New("invalidcl")} + require.Panics(t, func() { + CreateStatus( + context.Background(), + params.operationType, + params.objects, + params.success, + params.folders, + params.err, + ) + }) +} diff --git a/src/pkg/logger/logger.go b/src/pkg/logger/logger.go index 7c8660228..99e2e97b2 100644 --- a/src/pkg/logger/logger.go +++ b/src/pkg/logger/logger.go @@ -8,30 +8,70 @@ import ( "go.uber.org/zap/zapcore" ) -var logCore *zapcore.Core +var ( + logCore *zapcore.Core + loggerton *zap.SugaredLogger +) -func coreSingleton() *zapcore.Core { - if logCore == nil { - // level handling - highPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { - return lvl >= zapcore.ErrorLevel - }) - lowPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { - return lvl < zapcore.ErrorLevel - }) - // level-based output - consoleDebugging := zapcore.Lock(os.Stdout) - consoleErrors := zapcore.Lock(os.Stderr) - // encoder type - consoleEncoder := zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig()) - // combine into a logger core - core := zapcore.NewTee( - zapcore.NewCore(consoleEncoder, consoleErrors, highPriority), - zapcore.NewCore(consoleEncoder, consoleDebugging, lowPriority), - ) - logCore = &core +type logLevel int + +const ( + Development logLevel = iota + Info + Warn + Production +) + +func singleton(level logLevel) *zap.SugaredLogger { + if loggerton != nil { + return loggerton } - return logCore + + // set up a logger core to use as a fallback + levelFilter := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { + switch level { + case Info: + return lvl >= zapcore.InfoLevel + case Warn: + return lvl >= zapcore.WarnLevel + case Production: + return lvl >= zapcore.ErrorLevel + default: + return true + } + }) + out := zapcore.Lock(os.Stderr) + consoleEncoder := zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig()) + core := zapcore.NewTee( + zapcore.NewCore(consoleEncoder, out, levelFilter), + ) + logCore = &core + + // then try to set up a logger directly + var ( + lgr *zap.Logger + err error + ) + if level != Production { + cfg := zap.NewDevelopmentConfig() + switch level { + case Info: + cfg.Level = zap.NewAtomicLevelAt(zapcore.InfoLevel) + case Warn: + cfg.Level = zap.NewAtomicLevelAt(zapcore.WarnLevel) + } + lgr, err = cfg.Build() + } else { + lgr, err = zap.NewProduction() + } + + // fall back to the core config if the default creation fails + if err != nil { + lgr = zap.New(*logCore) + } + + loggerton = lgr.Sugar() + return loggerton } type loggingKey string @@ -40,16 +80,15 @@ const ctxKey loggingKey = "corsoLogger" // Seed embeds a logger into the context for later retrieval. func Seed(ctx context.Context) (context.Context, *zap.SugaredLogger) { - l := zap.New(*coreSingleton()) - s := l.Sugar() - return context.WithValue(ctx, ctxKey, s), s + l := singleton(0) + return context.WithValue(ctx, ctxKey, l), l } // Ctx retrieves the logger embedded in the context. func Ctx(ctx context.Context) *zap.SugaredLogger { l := ctx.Value(ctxKey) if l == nil { - return zap.New(*coreSingleton()).Sugar() + return singleton(0) } return l.(*zap.SugaredLogger) }