From 42d8935efb6428d3cbb5f20f0dd1a94d978a3d2b Mon Sep 17 00:00:00 2001 From: Stefan Bueringer Date: Wed, 16 Feb 2022 15:17:16 +0100 Subject: [PATCH] Enable per-reconcile logger customization MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stefan Büringer buringerst@vmware.com --- pkg/builder/controller.go | 7 +++++++ pkg/controller/controller.go | 4 ++++ pkg/internal/controller/controller.go | 13 ++++++++++--- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/pkg/builder/controller.go b/pkg/builder/controller.go index 9a74d6ec9a..0774a8a06a 100644 --- a/pkg/builder/controller.go +++ b/pkg/builder/controller.go @@ -154,6 +154,13 @@ func (blder *Builder) WithLogger(log logr.Logger) *Builder { return blder } +// WithLoggerCustomizer sets a LoggerCustomizer which allows per-reconcile customization +// of the logger. +func (blder *Builder) WithLoggerCustomizer(loggerCustomizer func(logr.Logger, reconcile.Request) logr.Logger) *Builder { + blder.ctrlOptions.LoggerCustomizer = loggerCustomizer + return blder +} + // Named sets the name of the controller to the given name. The name shows up // in metrics, among other things, and thus should be a prometheus compatible name // (underscores and alphanumeric characters only). diff --git a/pkg/controller/controller.go b/pkg/controller/controller.go index 02a806da24..d2965d7658 100644 --- a/pkg/controller/controller.go +++ b/pkg/controller/controller.go @@ -50,6 +50,9 @@ type Options struct { // request via the context field. Log logr.Logger + // LoggerCustomizer customizes the logger for individual reconciliations. + LoggerCustomizer func(logr.Logger, reconcile.Request) logr.Logger + // CacheSyncTimeout refers to the time limit set to wait for syncing caches. // Defaults to 2 minutes if not set. CacheSyncTimeout time.Duration @@ -137,6 +140,7 @@ func NewUnmanaged(name string, mgr manager.Manager, options Options) (Controller SetFields: mgr.SetFields, Name: name, Log: options.Log.WithName("controller").WithName(name).WithValues("controller", name), + LoggerCustomizer: options.LoggerCustomizer, RecoverPanic: options.RecoverPanic, }, nil } diff --git a/pkg/internal/controller/controller.go b/pkg/internal/controller/controller.go index 1f4712d8bf..71a46f50ad 100644 --- a/pkg/internal/controller/controller.go +++ b/pkg/internal/controller/controller.go @@ -26,6 +26,7 @@ import ( "github.com/go-logr/logr" utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/client-go/util/workqueue" + "sigs.k8s.io/controller-runtime/pkg/handler" ctrlmetrics "sigs.k8s.io/controller-runtime/pkg/internal/controller/metrics" logf "sigs.k8s.io/controller-runtime/pkg/log" @@ -63,6 +64,9 @@ type Controller struct { // Deprecated: the caller should handle injected fields itself. SetFields func(i interface{}) error + // LoggerCustomizer customizes the logger for individual reconciliations. + LoggerCustomizer func(logr.Logger, reconcile.Request) logr.Logger + // mu is used to synchronize Controller setup mu sync.Mutex @@ -109,8 +113,6 @@ func (c *Controller) Reconcile(ctx context.Context, req reconcile.Request) (_ re } }() } - log := c.Log.WithValues("name", req.Name, "namespace", req.Namespace) - ctx = logf.IntoContext(ctx, log) return c.Do.Reconcile(ctx, req) } @@ -303,7 +305,12 @@ func (c *Controller) reconcileHandler(ctx context.Context, obj interface{}) { return } - log := c.Log.WithValues("name", req.Name, "namespace", req.Namespace) + var log logr.Logger + if c.LoggerCustomizer != nil { + log = c.LoggerCustomizer(c.Log, req) + } else { + log = c.Log.WithValues("name", req.Name, "namespace", req.Namespace) + } ctx = logf.IntoContext(ctx, log) // RunInformersAndControllers the syncHandler, passing it the Namespace/Name string of the