From 99bf5b18f6a291dce3e72b34e2d663489d3102e8 Mon Sep 17 00:00:00 2001 From: Tianpeng Wang Date: Mon, 8 Aug 2022 11:57:29 +0800 Subject: [PATCH] Allow override default logger for compat Signed-off-by: Tianpeng Wang --- pkg/builder/controller.go | 17 ++++++++++++++++- pkg/builder/controller_test.go | 22 ++++++++++++++++++++++ pkg/controller/controller.go | 13 ++++++++++++- 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/pkg/builder/controller.go b/pkg/builder/controller.go index efaf069205..139637c402 100644 --- a/pkg/builder/controller.go +++ b/pkg/builder/controller.go @@ -155,6 +155,14 @@ func (blder *Builder) WithLogConstructor(logConstructor func(*reconcile.Request) return blder } +// WithLogger overrides the controller options's GetDefaultLogger. +func (blder *Builder) WithLogger(log logr.Logger) *Builder { + blder.ctrlOptions.GetDefaultLogger = func() logr.Logger { + return log + } + 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). @@ -309,7 +317,14 @@ func (blder *Builder) doController(r reconcile.Reconciler) error { // Setup the logger. if ctrlOptions.LogConstructor == nil { - log := blder.mgr.GetLogger().WithValues( + var log logr.Logger + if ctrlOptions.GetDefaultLogger != nil { + log = ctrlOptions.GetDefaultLogger() + } else { + log = blder.mgr.GetLogger() + } + + log = log.WithValues( "controller", controllerName, "controllerGroup", gvk.Group, "controllerKind", gvk.Kind, diff --git a/pkg/builder/controller_test.go b/pkg/builder/controller_test.go index 56c1a41458..2e6be7a9a0 100644 --- a/pkg/builder/controller_test.go +++ b/pkg/builder/controller_test.go @@ -259,6 +259,28 @@ var _ = Describe("application", func() { Expect(instance).NotTo(BeNil()) }) + It("should honor default log options", func() { + logger := &testLogger{} + newController = func(name string, mgr manager.Manager, options controller.Options) (controller.Controller, error) { + if options.GetDefaultLogger != nil && options.GetDefaultLogger().GetSink() == logger { + return controller.New(name, mgr, options) + } + return nil, fmt.Errorf("logger expected %T but found %T", logger, options.LogConstructor) + } + + By("creating a controller manager") + m, err := manager.New(cfg, manager.Options{}) + Expect(err).NotTo(HaveOccurred()) + + instance, err := ControllerManagedBy(m). + For(&appsv1.ReplicaSet{}). + Owns(&appsv1.ReplicaSet{}). + WithLogger(logr.New(logger)). + Build(noop) + Expect(err).NotTo(HaveOccurred()) + Expect(instance).NotTo(BeNil()) + }) + It("should prefer reconciler from options during creation of controller", func() { newController = func(name string, mgr manager.Manager, options controller.Options) (controller.Controller, error) { if options.Reconciler != (typedNoop{}) { diff --git a/pkg/controller/controller.go b/pkg/controller/controller.go index 8e3d8591d6..70f0248bff 100644 --- a/pkg/controller/controller.go +++ b/pkg/controller/controller.go @@ -51,6 +51,10 @@ type Options struct { // to each reconciliation via the context field. LogConstructor func(request *reconcile.Request) logr.Logger + // GetDefaultLogger returns this controller's root logger, used only if LogConstructor is not set. + // By defaults, manager.GetDefaultLogger will be used. + GetDefaultLogger func() logr.Logger + // CacheSyncTimeout refers to the time limit set to wait for syncing caches. // Defaults to 2 minutes if not set. CacheSyncTimeout time.Duration @@ -107,7 +111,14 @@ func NewUnmanaged(name string, mgr manager.Manager, options Options) (Controller } if options.LogConstructor == nil { - log := mgr.GetLogger().WithValues( + var log logr.Logger + if options.GetDefaultLogger != nil { + log = options.GetDefaultLogger() + } else { + log = mgr.GetLogger() + } + + log = log.WithValues( "controller", name, ) options.LogConstructor = func(req *reconcile.Request) logr.Logger {