diff --git a/context.go b/context.go index b9aa184..d1ad4d8 100644 --- a/context.go +++ b/context.go @@ -2,9 +2,7 @@ package ilog import "context" -type contextKey string - -const contextKeyLogger contextKey = "Logger" +type contextKeyLogger struct{} func FromContext(ctx context.Context) (logger Logger) { if ctx == nil { @@ -12,7 +10,7 @@ func FromContext(ctx context.Context) (logger Logger) { return Global().Copy() } - v := ctx.Value(contextKeyLogger) + v := ctx.Value(contextKeyLogger{}) l, ok := v.(Logger) if !ok { @@ -24,5 +22,5 @@ func FromContext(ctx context.Context) (logger Logger) { } func WithContext(ctx context.Context, logger Logger) context.Context { - return context.WithValue(ctx, contextKeyLogger, logger) + return context.WithValue(ctx, contextKeyLogger{}, logger) } diff --git a/context_test.go b/context_test.go index 9f667a3..13bad4a 100644 --- a/context_test.go +++ b/context_test.go @@ -35,7 +35,7 @@ func TestContext(t *testing.T) { t.Run("failure,invalidType", func(t *testing.T) { buf := bytes.NewBuffer(nil) defer SetGlobal(NewBuilder(DebugLevel, buf).SetTimestampZone(time.UTC).Build())() - _ = FromContext(context.WithValue(context.Background(), contextKeyLogger, "invalid")) //nolint:staticcheck + _ = FromContext(context.WithValue(context.Background(), contextKeyLogger{}, "invalid")) //nolint:staticcheck if expected := regexp.MustCompilePOSIX(`{"severity":"ERROR","timestamp":"[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\.?[0-9]*Z","caller":"ilog\.go/[a-z_]+\.go:[0-9]+","message":"ilog: type assertion failed: expected=ilog.Logger, actual=string, value=\\"invalid\\""}`); !expected.Match(buf.Bytes()) { t.Errorf("❌: !expected.Match(buf.Bytes()):\n%s", buf) } diff --git a/ilog.go b/ilog.go index 12f2e7f..a03dd54 100644 --- a/ilog.go +++ b/ilog.go @@ -26,11 +26,11 @@ type Logger interface { // Level returns the current logging level of the logger. Level() (currentLoggerLevel Level) // SetLevel sets the logging level of the logger. - SetLevel(level Level) (logger Logger) + SetLevel(level Level) (copied Logger) // AddCallerSkip adds the number of stack frames to skip to the logger. - AddCallerSkip(skip int) (logger Logger) + AddCallerSkip(skip int) (copied Logger) // Copy returns a copy of the logger. - Copy() (copiedLogger Logger) + Copy() (copied Logger) // Common is the interface that has the common logging methods for both ilog.Logger and ilog.LogEntry. Common @@ -84,7 +84,7 @@ type LogEntry interface { Common // Logger returns a new logger with the same fields of the log entry. - Logger() (copiedLogger Logger) + Logger() (copied Logger) // error: for considering undispatched LogEntry as error so that they can be detected by Go static analysis. error diff --git a/ilog_default_implementation.go b/ilog_default_implementation.go index 53f6281..3590118 100644 --- a/ilog_default_implementation.go +++ b/ilog_default_implementation.go @@ -147,13 +147,15 @@ func (l *implLogger) Level() Level { } func (l *implLogger) SetLevel(level Level) Logger { - l.config.level = level - return l + copied := l.copy() + copied.config.level = level + return copied } func (l *implLogger) AddCallerSkip(skip int) Logger { - l.config.callerSkip += skip - return l + copied := l.copy() + copied.config.callerSkip += skip + return copied } func (l *implLogger) Copy() Logger { diff --git a/implementations/zap/zap.go b/implementations/zap/zap.go index fab7bb5..249fe3a 100644 --- a/implementations/zap/zap.go +++ b/implementations/zap/zap.go @@ -25,13 +25,15 @@ func (l *implLogger) Level() ilog.Level { } func (l *implLogger) SetLevel(level ilog.Level) ilog.Logger { - l.level = level - return l + copied := l.copy() + copied.level = level + return copied } func (l *implLogger) AddCallerSkip(skip int) ilog.Logger { - l.zapLogger = l.zapLogger.WithOptions(zap.AddCallerSkip(skip)) - return l + copied := l.copy() + copied.zapLogger = l.zapLogger.WithOptions(zap.AddCallerSkip(skip)) + return copied } func (l *implLogger) Copy() ilog.Logger { diff --git a/implementations/zerolog/zerolog.go b/implementations/zerolog/zerolog.go index 9057251..cdad909 100644 --- a/implementations/zerolog/zerolog.go +++ b/implementations/zerolog/zerolog.go @@ -25,14 +25,16 @@ func (l *implLogger) Level() ilog.Level { } func (l *implLogger) SetLevel(level ilog.Level) ilog.Logger { - l.level = level - return l + copied := l.copy() + copied.level = level + return copied } func (l *implLogger) AddCallerSkip(skip int) ilog.Logger { + copied := l.copy() logger := l.zerologLogger.With().Caller().CallerWithSkipFrameCount(skip).Logger() - l.zerologLogger = &logger - return l + copied.zerologLogger = &logger + return copied } func (l *implLogger) Copy() ilog.Logger {