From 552b92b8f166e1f7f114048f36244a96de216ffc Mon Sep 17 00:00:00 2001 From: Matheus Pimenta Date: Tue, 13 Jan 2026 10:34:01 +0000 Subject: [PATCH] feat(logging): introduce logging API Signed-off-by: Matheus Pimenta --- internal/logging/logging.go | 12 +++--------- internal/logging/logging_test.go | 6 ++++-- pkg/logging/logging.go | 27 +++++++++++++++++++++++++++ pkg/storage/storage.go | 3 ++- 4 files changed, 36 insertions(+), 12 deletions(-) create mode 100644 pkg/logging/logging.go diff --git a/internal/logging/logging.go b/internal/logging/logging.go index 674e2db34..1cba7eb5c 100644 --- a/internal/logging/logging.go +++ b/internal/logging/logging.go @@ -21,6 +21,8 @@ import ( "log/slog" "os" "sync/atomic" + + api "helm.sh/helm/v4/pkg/logging" ) // DebugEnabledFunc is a function type that determines if debug logging is enabled @@ -90,14 +92,6 @@ func NewLogger(debugEnabled DebugEnabledFunc) *slog.Logger { return slog.New(dynamicHandler) } -// LoggerSetterGetter is an interface that can set and get a logger -type LoggerSetterGetter interface { - // SetLogger sets a new slog.Handler - SetLogger(newHandler slog.Handler) - // Logger returns the slog.Logger created from the slog.Handler - Logger() *slog.Logger -} - type LogHolder struct { // logger is an atomic.Pointer[slog.Logger] to store the slog.Logger // We use atomic.Pointer for thread safety @@ -122,4 +116,4 @@ func (l *LogHolder) SetLogger(newHandler slog.Handler) { } // Ensure LogHolder implements LoggerSetterGetter -var _ LoggerSetterGetter = &LogHolder{} +var _ api.LoggerSetterGetter = &LogHolder{} diff --git a/internal/logging/logging_test.go b/internal/logging/logging_test.go index d22a47a31..3e8cc03ec 100644 --- a/internal/logging/logging_test.go +++ b/internal/logging/logging_test.go @@ -24,6 +24,8 @@ import ( "time" "github.com/stretchr/testify/assert" + + api "helm.sh/helm/v4/pkg/logging" ) func TestLogHolder_Logger(t *testing.T) { @@ -99,11 +101,11 @@ func TestLogHolder_SetLogger(t *testing.T) { func TestLogHolder_InterfaceCompliance(t *testing.T) { t.Run("implements LoggerSetterGetter interface", func(_ *testing.T) { - var _ LoggerSetterGetter = &LogHolder{} + var _ api.LoggerSetterGetter = &LogHolder{} }) t.Run("interface methods work correctly", func(t *testing.T) { - var holder LoggerSetterGetter = &LogHolder{} + var holder api.LoggerSetterGetter = &LogHolder{} buf := &bytes.Buffer{} handler := slog.NewTextHandler(buf, &slog.HandlerOptions{Level: slog.LevelDebug}) diff --git a/pkg/logging/logging.go b/pkg/logging/logging.go new file mode 100644 index 000000000..f00e442e2 --- /dev/null +++ b/pkg/logging/logging.go @@ -0,0 +1,27 @@ +/* +Copyright The Helm Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package logging + +import "log/slog" + +// LoggerSetterGetter is an interface that can set and get a logger +type LoggerSetterGetter interface { + // SetLogger sets a new slog.Handler + SetLogger(newHandler slog.Handler) + // Logger returns the slog.Logger created from the slog.Handler + Logger() *slog.Logger +} diff --git a/pkg/storage/storage.go b/pkg/storage/storage.go index d6c41635b..40f4181c6 100644 --- a/pkg/storage/storage.go +++ b/pkg/storage/storage.go @@ -23,6 +23,7 @@ import ( "strings" "helm.sh/helm/v4/internal/logging" + loggingapi "helm.sh/helm/v4/pkg/logging" "helm.sh/helm/v4/pkg/release" "helm.sh/helm/v4/pkg/release/common" rspb "helm.sh/helm/v4/pkg/release/v1" @@ -340,7 +341,7 @@ func Init(d driver.Driver) *Storage { } // Get logger from driver if it implements the LoggerSetterGetter interface - if ls, ok := d.(logging.LoggerSetterGetter); ok { + if ls, ok := d.(loggingapi.LoggerSetterGetter); ok { ls.SetLogger(s.Logger().Handler()) } else { // If the driver does not implement the LoggerSetterGetter interface, set the default logger