From fe43c5dba4ff82e9a3b69ba4d747d37ec2aa54cf Mon Sep 17 00:00:00 2001 From: Miccah Date: Tue, 19 Nov 2024 14:57:08 -0800 Subject: [PATCH] Add log.ToLogger and log.ToSlogger helper functions (#3629) --- pkg/log/log.go | 12 ++++++++++++ pkg/log/log_test.go | 46 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/pkg/log/log.go b/pkg/log/log.go index 35f6b10b9..ca66f8620 100644 --- a/pkg/log/log.go +++ b/pkg/log/log.go @@ -4,6 +4,8 @@ import ( "errors" "fmt" "io" + "log" + "log/slog" "time" "github.com/TheZeroSlave/zapsentry" @@ -184,6 +186,16 @@ func WithGlobalRedaction() func(*sinkConfig) { } } +// ToLogger converts the logr.Logger into a legacy *log.Logger. +func ToLogger(l logr.Logger) *log.Logger { + return slog.NewLogLogger(logr.ToSlogHandler(l), slog.LevelInfo) +} + +// ToSlogger converts the logr.Logger into a *slog.Logger. +func ToSlogger(l logr.Logger) *slog.Logger { + return slog.New(logr.ToSlogHandler(l)) +} + // firstErrorFunc is a helper function that returns a function that executes // all provided args and returns the first error, if any. func firstErrorFunc(fs ...func() error) func() error { diff --git a/pkg/log/log_test.go b/pkg/log/log_test.go index b1827b5d8..4be964b68 100644 --- a/pkg/log/log_test.go +++ b/pkg/log/log_test.go @@ -290,6 +290,52 @@ func TestGlobalRedaction_JSON(t *testing.T) { ) } +func TestToLogger(t *testing.T) { + var jsonBuffer bytes.Buffer + l, flush := New("service-name", + WithJSONSink(&jsonBuffer), + ) + logger := ToLogger(l) + logger.Println("yay") + assert.Nil(t, flush()) + + var parsedJSON map[string]any + assert.Nil(t, json.Unmarshal(jsonBuffer.Bytes(), &parsedJSON)) + assert.NotEmpty(t, parsedJSON["ts"]) + delete(parsedJSON, "ts") + delete(parsedJSON, "caller") // log.Logger adds a "caller" field + assert.Equal(t, + map[string]any{ + "level": "info-0", + "logger": "service-name", + "msg": "yay", + }, + parsedJSON, + ) +} + +func TestToSlogger(t *testing.T) { + var jsonBuffer bytes.Buffer + l, flush := New("service-name", WithJSONSink(&jsonBuffer)) + logger := ToSlogger(l) + logger.Info("yay") + assert.Nil(t, flush()) + + var parsedJSON map[string]any + assert.Nil(t, json.Unmarshal(jsonBuffer.Bytes(), &parsedJSON)) + assert.NotEmpty(t, parsedJSON["ts"]) + delete(parsedJSON, "ts") + delete(parsedJSON, "caller") // slog.Logger adds a "caller" field + assert.Equal(t, + map[string]any{ + "level": "info-0", + "logger": "service-name", + "msg": "yay", + }, + parsedJSON, + ) +} + func BenchmarkLoggerRedact(b *testing.B) { msg := "this is a message with 'foo' in it" logKvps := []any{"key", "value", "foo", "bar", "bar", "baz", "longval", "84hblnqwp97ewilbgoab8fhqlngahs6dl3i269haa"}