feat(logging): introduce logging API

Signed-off-by: Matheus Pimenta <matheuscscp@gmail.com>
pull/31721/head
Matheus Pimenta 9 months ago
parent 8f1bbb30cf
commit 552b92b8f1
No known key found for this signature in database
GPG Key ID: 4639F038AE28FBFF

@ -21,6 +21,8 @@ import (
"log/slog" "log/slog"
"os" "os"
"sync/atomic" "sync/atomic"
api "helm.sh/helm/v4/pkg/logging"
) )
// DebugEnabledFunc is a function type that determines if debug logging is enabled // 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) 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 { type LogHolder struct {
// logger is an atomic.Pointer[slog.Logger] to store the slog.Logger // logger is an atomic.Pointer[slog.Logger] to store the slog.Logger
// We use atomic.Pointer for thread safety // We use atomic.Pointer for thread safety
@ -122,4 +116,4 @@ func (l *LogHolder) SetLogger(newHandler slog.Handler) {
} }
// Ensure LogHolder implements LoggerSetterGetter // Ensure LogHolder implements LoggerSetterGetter
var _ LoggerSetterGetter = &LogHolder{} var _ api.LoggerSetterGetter = &LogHolder{}

@ -24,6 +24,8 @@ import (
"time" "time"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
api "helm.sh/helm/v4/pkg/logging"
) )
func TestLogHolder_Logger(t *testing.T) { func TestLogHolder_Logger(t *testing.T) {
@ -99,11 +101,11 @@ func TestLogHolder_SetLogger(t *testing.T) {
func TestLogHolder_InterfaceCompliance(t *testing.T) { func TestLogHolder_InterfaceCompliance(t *testing.T) {
t.Run("implements LoggerSetterGetter interface", func(_ *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) { t.Run("interface methods work correctly", func(t *testing.T) {
var holder LoggerSetterGetter = &LogHolder{} var holder api.LoggerSetterGetter = &LogHolder{}
buf := &bytes.Buffer{} buf := &bytes.Buffer{}
handler := slog.NewTextHandler(buf, &slog.HandlerOptions{Level: slog.LevelDebug}) handler := slog.NewTextHandler(buf, &slog.HandlerOptions{Level: slog.LevelDebug})

@ -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
}

@ -23,6 +23,7 @@ import (
"strings" "strings"
"helm.sh/helm/v4/internal/logging" "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"
"helm.sh/helm/v4/pkg/release/common" "helm.sh/helm/v4/pkg/release/common"
rspb "helm.sh/helm/v4/pkg/release/v1" 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 // 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()) ls.SetLogger(s.Logger().Handler())
} else { } else {
// If the driver does not implement the LoggerSetterGetter interface, set the default logger // If the driver does not implement the LoggerSetterGetter interface, set the default logger

Loading…
Cancel
Save