From 2cd8479908052d73785e78df9e5b8b9f9f09b031 Mon Sep 17 00:00:00 2001 From: "maksim.konovalov" Date: Thu, 23 Jan 2025 12:39:42 +0300 Subject: [PATCH] Add slog logger provider --- CHANGELOG.md | 3 +++ providers.go | 36 ++++++++++++++++++++++++++++++++++++ providers_test.go | 43 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 09e1854..22fb03d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ ## Unreleased +FEATURES: +- Slog provider is available now. Use NewSlogLogger for slog log provider creation. + BUG FIXES: - Fixed go.mod and go.sum files with go mod tidy. diff --git a/providers.go b/providers.go index abaa1c4..59b7a42 100644 --- a/providers.go +++ b/providers.go @@ -2,7 +2,9 @@ package vshard_router //nolint:revive import ( "context" + "fmt" "log" + "log/slog" "time" ) @@ -12,6 +14,8 @@ var ( // Ensure StdoutLoggerf implements LogfProvider _ LogfProvider = StdoutLoggerf{} + // Ensure SlogLoggerf implements LogfProvider + _ LogfProvider = &SlogLoggerf{} ) // LogfProvider an interface to inject a custom logger. @@ -83,6 +87,38 @@ func (s StdoutLoggerf) Errorf(_ context.Context, format string, v ...any) { s.printLevel(StdoutLogError, "[ERROR] ", format, v...) } +// NewSlogLogger wraps slog logger +func NewSlogLogger(logger *slog.Logger) LogfProvider { + return &SlogLoggerf{ + Logger: logger, + } +} + +// SlogLoggerf is adapter for slog to Logger interface. +type SlogLoggerf struct { + Logger *slog.Logger +} + +// Debugf implements Debugf method for LogfProvider interface +func (s *SlogLoggerf) Debugf(ctx context.Context, format string, v ...any) { + s.Logger.DebugContext(ctx, fmt.Sprintf(format, v...)) +} + +// Infof implements Infof method for LogfProvider interface +func (s SlogLoggerf) Infof(ctx context.Context, format string, v ...any) { + s.Logger.InfoContext(ctx, fmt.Sprintf(format, v...)) +} + +// Warnf implements Warnf method for LogfProvider interface +func (s SlogLoggerf) Warnf(ctx context.Context, format string, v ...any) { + s.Logger.WarnContext(ctx, fmt.Sprintf(format, v...)) +} + +// Errorf implements Errorf method for LogfProvider interface +func (s SlogLoggerf) Errorf(ctx context.Context, format string, v ...any) { + s.Logger.ErrorContext(ctx, fmt.Sprintf(format, v...)) +} + // Metrics // MetricsProvider is an interface for passing library metrics to your prometheus/graphite and other metrics diff --git a/providers_test.go b/providers_test.go index 8a7a809..817696c 100644 --- a/providers_test.go +++ b/providers_test.go @@ -2,6 +2,8 @@ package vshard_router_test import ( "context" + "log/slog" + "os" "testing" "time" @@ -49,3 +51,44 @@ func TestStdoutLogger(t *testing.T) { stdoutLogger.Debugf(ctx, "") }) } + +func TestNewSlogLogger(t *testing.T) { + var slogProvider vshardrouter.LogfProvider + + require.NotPanics(t, func() { + slogProvider = vshardrouter.NewSlogLogger(nil) + }) + + require.Panics(t, func() { + slogProvider.Warnf(context.TODO(), "") + }) +} + +func TestSlogProvider(t *testing.T) { + ctx := context.Background() + + // create new logger handler + handler := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{ + Level: slog.LevelError, + }) + // create new SLogger instance + sLogger := slog.New(handler) + + logProvider := vshardrouter.NewSlogLogger(sLogger) + + require.NotPanics(t, func() { + logProvider.Infof(ctx, "test %s", "s") + }) + + require.NotPanics(t, func() { + logProvider.Warnf(ctx, "test %s", "s") + }) + + require.NotPanics(t, func() { + logProvider.Errorf(ctx, "test %s", "s") + }) + + require.NotPanics(t, func() { + logProvider.Debugf(ctx, "test %s", "s") + }) +}