From 5d1d2d5088c081963c86742661d3ca562f01a506 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Wed, 3 Jan 2024 15:50:20 +0100 Subject: [PATCH] add SetSlogLogger This is syntactic sugar, but it's still useful because it hides logr from developers who only care about klog and slog. --- contextual_slog.go | 31 +++++++++++++++++++++ contextual_slog_example_test.go | 48 +++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 contextual_slog.go create mode 100644 contextual_slog_example_test.go diff --git a/contextual_slog.go b/contextual_slog.go new file mode 100644 index 00000000..d3b56252 --- /dev/null +++ b/contextual_slog.go @@ -0,0 +1,31 @@ +//go:build go1.21 +// +build go1.21 + +/* +Copyright 2021 The Kubernetes 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 klog + +import ( + "log/slog" + + "github.com/go-logr/logr" +) + +// SetSlogLogger reconfigures klog to log through the slog logger. The logger must not be nil. +func SetSlogLogger(logger *slog.Logger) { + SetLoggerWithOptions(logr.FromSlogHandler(logger.Handler()), ContextualLogger(true)) +} diff --git a/contextual_slog_example_test.go b/contextual_slog_example_test.go new file mode 100644 index 00000000..0c2ba41a --- /dev/null +++ b/contextual_slog_example_test.go @@ -0,0 +1,48 @@ +//go:build go1.21 +// +build go1.21 + +/* +Copyright 2021 The Kubernetes 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 klog_test + +import ( + "log/slog" + "os" + + "k8s.io/klog/v2" +) + +func ExampleSetSlogLogger() { + state := klog.CaptureState() + defer state.Restore() + + handler := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ + ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr { + if a.Key == slog.TimeKey { + // Avoid non-deterministic output. + return slog.Attr{} + } + return a + }, + }) + logger := slog.New(handler) + klog.SetSlogLogger(logger) + klog.Info("hello world") + + // Output: + // level=INFO msg="hello world" +}