From 5f158d9647e619f8467996154f20b26f99fa1d47 Mon Sep 17 00:00:00 2001 From: Solly Ross Date: Wed, 9 Jan 2019 14:14:19 -0800 Subject: [PATCH 1/3] Logging structure refactor This splits up pkg/runtime/log into pkg/log, pkg/internal/log, and pkg/log/zap. - pkg/log contains generic logging helpers, and the generic root logger It *only* depends on logr, and thus won't pull in Zap if you don't need it. - pkg/internal/log contains the internal log handle (with the appropriate name). Nothing outside CR should be logging with this handle anyway, so this enforces it. - pkg/log/zap contains Zap-related setup code, and thus CR only has a dependency on Zap if you pull in this package. - pkg/runtime/log remains as a deprecated package to ease refactoring and compatibility. While practically a few types have been removed from this package, in reality most consumers shouldn't notice. --- pkg/internal/log/log.go | 35 +++ pkg/{runtime => }/log/deleg.go | 0 pkg/log/log.go | 34 +++ pkg/{runtime => }/log/log_suite_test.go | 2 +- pkg/{runtime => }/log/log_test.go | 143 +----------- pkg/{runtime => }/log/null.go | 0 pkg/{runtime/log => log/zap}/kube_helpers.go | 7 +- pkg/log/zap/zap.go | 68 ++++++ pkg/log/zap/zap_suite_test.go | 30 +++ pkg/log/zap/zap_test.go | 231 +++++++++++++++++++ pkg/runtime/log/log.go | 88 +++---- 11 files changed, 433 insertions(+), 205 deletions(-) create mode 100644 pkg/internal/log/log.go rename pkg/{runtime => }/log/deleg.go (100%) create mode 100644 pkg/log/log.go rename pkg/{runtime => }/log/log_suite_test.go (88%) rename pkg/{runtime => }/log/log_test.go (61%) rename pkg/{runtime => }/log/null.go (100%) rename pkg/{runtime/log => log/zap}/kube_helpers.go (96%) create mode 100644 pkg/log/zap/zap.go create mode 100644 pkg/log/zap/zap_suite_test.go create mode 100644 pkg/log/zap/zap_test.go diff --git a/pkg/internal/log/log.go b/pkg/internal/log/log.go new file mode 100644 index 0000000000..0d671b73d6 --- /dev/null +++ b/pkg/internal/log/log.go @@ -0,0 +1,35 @@ +/* +Copyright 2018 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 log contains utilities for fetching a new logger +// when one is not already available. +// Deprecated: use pkg/log +package log + +import ( + "github.com/go-logr/logr" + + "sigs.k8s.io/controller-runtime/pkg/log" +) + +var ( + // RuntimeLog is a base parent logger for use inside controller-runtime. + RuntimeLog logr.Logger +) + +func init() { + RuntimeLog = log.Log.WithName("controller-runtime") +} diff --git a/pkg/runtime/log/deleg.go b/pkg/log/deleg.go similarity index 100% rename from pkg/runtime/log/deleg.go rename to pkg/log/deleg.go diff --git a/pkg/log/log.go b/pkg/log/log.go new file mode 100644 index 0000000000..b541231967 --- /dev/null +++ b/pkg/log/log.go @@ -0,0 +1,34 @@ +/* +Copyright 2018 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 log contains utilities for fetching a new logger +// when one is not already available. +// Deprecated: use pkg/log +package log + +import ( + "github.com/go-logr/logr" +) + +// SetLogger sets a concrete logging implementation for all deferred Loggers. +func SetLogger(l logr.Logger) { + Log.Fulfill(l) +} + +// Log is the base logger used by kubebuilder. It delegates +// to another logr.Logger. You *must* call SetLogger to +// get any actual logging. +var Log = NewDelegatingLogger(NullLogger{}) diff --git a/pkg/runtime/log/log_suite_test.go b/pkg/log/log_suite_test.go similarity index 88% rename from pkg/runtime/log/log_suite_test.go rename to pkg/log/log_suite_test.go index a78b451060..3fb749caca 100644 --- a/pkg/runtime/log/log_suite_test.go +++ b/pkg/log/log_suite_test.go @@ -26,5 +26,5 @@ import ( func TestSource(t *testing.T) { RegisterFailHandler(Fail) - RunSpecsWithDefaultAndCustomReporters(t, "Runtime Log Suite", []Reporter{printer.NewlineReporter{}}) + RunSpecsWithDefaultAndCustomReporters(t, "Log Suite", []Reporter{printer.NewlineReporter{}}) } diff --git a/pkg/runtime/log/log_test.go b/pkg/log/log_test.go similarity index 61% rename from pkg/runtime/log/log_test.go rename to pkg/log/log_test.go index 044e314a85..1ec5f51e0c 100644 --- a/pkg/runtime/log/log_test.go +++ b/pkg/log/log_test.go @@ -17,35 +17,12 @@ limitations under the License. package log import ( - "bytes" - "encoding/json" - "io/ioutil" "github.com/go-logr/logr" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" - kapi "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/types" ) -// testStringer is a fmt.Stringer -type testStringer struct{} - -func (testStringer) String() string { - return "value" -} - -// fakeSyncWriter is a fake zap.SyncerWriter that lets us test if sync was called -type fakeSyncWriter bool - -func (w *fakeSyncWriter) Write(p []byte) (int, error) { - return len(p), nil -} -func (w *fakeSyncWriter) Sync() error { - *w = true - return nil -} - // logInfo is the information for a particular fakeLogger message type logInfo struct { name []string @@ -112,7 +89,7 @@ func (f *fakeLogger) Info(msg string, vals ...interface{}) { func (f *fakeLogger) Enabled() bool { return true } func (f *fakeLogger) V(lvl int) logr.InfoLogger { return f } -var _ = Describe("runtime log", func() { +var _ = Describe("logging", func() { Describe("top-level logger", func() { It("hold newly created loggers until a logger is set", func() { @@ -238,122 +215,4 @@ var _ = Describe("runtime log", func() { )) }) }) - - Describe("Zap logger setup", func() { - Context("with the default output", func() { - It("shouldn't fail when setting up production", func() { - Expect(ZapLogger(false)).NotTo(BeNil()) - }) - - It("shouldn't fail when setting up development", func() { - Expect(ZapLogger(true)).NotTo(BeNil()) - }) - }) - - Context("with custom non-sync output", func() { - It("shouldn't fail when setting up production", func() { - Expect(ZapLoggerTo(ioutil.Discard, false)).NotTo(BeNil()) - }) - - It("shouldn't fail when setting up development", func() { - Expect(ZapLoggerTo(ioutil.Discard, true)).NotTo(BeNil()) - }) - }) - - Context("when logging kubernetes objects", func() { - var logOut *bytes.Buffer - var logger logr.Logger - - BeforeEach(func() { - logOut = new(bytes.Buffer) - By("setting up the logger") - // use production settings (false) to get just json output - logger = ZapLoggerTo(logOut, false) - }) - - It("should log a standard namespaced Kubernetes object name and namespace", func() { - pod := &kapi.Pod{} - pod.Name = "some-pod" - pod.Namespace = "some-ns" - logger.Info("here's a kubernetes object", "thing", pod) - - outRaw := logOut.Bytes() - res := map[string]interface{}{} - Expect(json.Unmarshal(outRaw, &res)).To(Succeed()) - - Expect(res).To(HaveKeyWithValue("thing", map[string]interface{}{ - "name": pod.Name, - "namespace": pod.Namespace, - })) - }) - - It("should work fine with normal stringers", func() { - logger.Info("here's a non-kubernetes stringer", "thing", testStringer{}) - outRaw := logOut.Bytes() - res := map[string]interface{}{} - Expect(json.Unmarshal(outRaw, &res)).To(Succeed()) - - Expect(res).To(HaveKeyWithValue("thing", "value")) - }) - - It("should log a standard non-namespaced Kubernetes object name", func() { - node := &kapi.Node{} - node.Name = "some-node" - logger.Info("here's a kubernetes object", "thing", node) - - outRaw := logOut.Bytes() - res := map[string]interface{}{} - Expect(json.Unmarshal(outRaw, &res)).To(Succeed()) - - Expect(res).To(HaveKeyWithValue("thing", map[string]interface{}{ - "name": node.Name, - })) - }) - - It("should log a standard Kubernetes object's kind, if set", func() { - node := &kapi.Node{} - node.Name = "some-node" - node.APIVersion = "v1" - node.Kind = "Node" - logger.Info("here's a kubernetes object", "thing", node) - - outRaw := logOut.Bytes() - res := map[string]interface{}{} - Expect(json.Unmarshal(outRaw, &res)).To(Succeed()) - - Expect(res).To(HaveKeyWithValue("thing", map[string]interface{}{ - "name": node.Name, - "apiVersion": "v1", - "kind": "Node", - })) - }) - - It("should log a standard non-namespaced NamespacedName name", func() { - name := types.NamespacedName{Name: "some-node"} - logger.Info("here's a kubernetes object", "thing", name) - - outRaw := logOut.Bytes() - res := map[string]interface{}{} - Expect(json.Unmarshal(outRaw, &res)).To(Succeed()) - - Expect(res).To(HaveKeyWithValue("thing", map[string]interface{}{ - "name": name.Name, - })) - }) - - It("should log a standard namespaced NamespacedName name and namespace", func() { - name := types.NamespacedName{Name: "some-pod", Namespace: "some-ns"} - logger.Info("here's a kubernetes object", "thing", name) - - outRaw := logOut.Bytes() - res := map[string]interface{}{} - Expect(json.Unmarshal(outRaw, &res)).To(Succeed()) - - Expect(res).To(HaveKeyWithValue("thing", map[string]interface{}{ - "name": name.Name, - "namespace": name.Namespace, - })) - }) - }) - }) }) diff --git a/pkg/runtime/log/null.go b/pkg/log/null.go similarity index 100% rename from pkg/runtime/log/null.go rename to pkg/log/null.go diff --git a/pkg/runtime/log/kube_helpers.go b/pkg/log/zap/kube_helpers.go similarity index 96% rename from pkg/runtime/log/kube_helpers.go rename to pkg/log/zap/kube_helpers.go index f07d1e6008..c88ba56cdc 100644 --- a/pkg/runtime/log/kube_helpers.go +++ b/pkg/log/zap/kube_helpers.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright 2019 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. @@ -14,9 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -// Package log contains utilities for fetching a new logger -// when one is not already available. -package log +package zap import ( "fmt" @@ -127,3 +125,4 @@ func (k *KubeAwareEncoder) EncodeEntry(entry zapcore.Entry, fields []zapcore.Fie return k.Encoder.EncodeEntry(entry, fields) } + diff --git a/pkg/log/zap/zap.go b/pkg/log/zap/zap.go new file mode 100644 index 0000000000..e58c5149c6 --- /dev/null +++ b/pkg/log/zap/zap.go @@ -0,0 +1,68 @@ +/* +Copyright 2019 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 zap contains helpers for setting up a new logr.Logger instance +// using the Zap logging framework. +package zap + +import ( + "io" + "os" + "time" + + "github.com/go-logr/logr" + "github.com/go-logr/zapr" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +// Logger is a Logger implementation. +// If development is true, a Zap development config will be used +// (stacktraces on warnings, no sampling), otherwise a Zap production +// config will be used (stacktraces on errors, sampling). +func Logger(development bool) logr.Logger { + return LoggerTo(os.Stderr, development) +} + +// LoggerTo returns a new Logger implementation using Zap which logs +// to the given destination, instead of stderr. It otherwise behaves like +// ZapLogger. +func LoggerTo(destWriter io.Writer, development bool) logr.Logger { + // this basically mimics NewConfig, but with a custom sink + sink := zapcore.AddSync(destWriter) + + var enc zapcore.Encoder + var lvl zap.AtomicLevel + var opts []zap.Option + if development { + encCfg := zap.NewDevelopmentEncoderConfig() + enc = zapcore.NewConsoleEncoder(encCfg) + lvl = zap.NewAtomicLevelAt(zap.DebugLevel) + opts = append(opts, zap.Development(), zap.AddStacktrace(zap.ErrorLevel)) + } else { + encCfg := zap.NewProductionEncoderConfig() + enc = zapcore.NewJSONEncoder(encCfg) + lvl = zap.NewAtomicLevelAt(zap.InfoLevel) + opts = append(opts, zap.AddStacktrace(zap.WarnLevel), + zap.WrapCore(func(core zapcore.Core) zapcore.Core { + return zapcore.NewSampler(core, time.Second, 100, 100) + })) + } + opts = append(opts, zap.AddCallerSkip(1), zap.ErrorOutput(sink)) + log := zap.New(zapcore.NewCore(&KubeAwareEncoder{Encoder: enc, Verbose: development}, sink, lvl)) + log = log.WithOptions(opts...) + return zapr.NewLogger(log) +} diff --git a/pkg/log/zap/zap_suite_test.go b/pkg/log/zap/zap_suite_test.go new file mode 100644 index 0000000000..711ea0ae17 --- /dev/null +++ b/pkg/log/zap/zap_suite_test.go @@ -0,0 +1,30 @@ +/* +Copyright 2018 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 zap + +import ( + "testing" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + "sigs.k8s.io/controller-runtime/pkg/envtest/printer" +) + +func TestSource(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecsWithDefaultAndCustomReporters(t, "Zap Log Suite", []Reporter{printer.NewlineReporter{}}) +} diff --git a/pkg/log/zap/zap_test.go b/pkg/log/zap/zap_test.go new file mode 100644 index 0000000000..8cbd8818d5 --- /dev/null +++ b/pkg/log/zap/zap_test.go @@ -0,0 +1,231 @@ +/* +Copyright 2018 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 zap + +import ( + "bytes" + "encoding/json" + "io/ioutil" + + "github.com/go-logr/logr" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + kapi "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/types" +) + +// testStringer is a fmt.Stringer +type testStringer struct{} + +func (testStringer) String() string { + return "value" +} + +// fakeSyncWriter is a fake zap.SyncerWriter that lets us test if sync was called +type fakeSyncWriter bool + +func (w *fakeSyncWriter) Write(p []byte) (int, error) { + return len(p), nil +} +func (w *fakeSyncWriter) Sync() error { + *w = true + return nil +} + +// logInfo is the information for a particular fakeLogger message +type logInfo struct { + name []string + tags []interface{} + msg string +} + +// fakeLoggerRoot is the root object to which all fakeLoggers record their messages. +type fakeLoggerRoot struct { + messages []logInfo +} + +// fakeLogger is a fake implementation of logr.Logger that records +// messages, tags, and names, +// just records the name. +type fakeLogger struct { + name []string + tags []interface{} + + root *fakeLoggerRoot +} + +func (f *fakeLogger) WithName(name string) logr.Logger { + names := append([]string(nil), f.name...) + names = append(names, name) + return &fakeLogger{ + name: names, + tags: f.tags, + root: f.root, + } +} + +func (f *fakeLogger) WithValues(vals ...interface{}) logr.Logger { + tags := append([]interface{}(nil), f.tags...) + tags = append(tags, vals...) + return &fakeLogger{ + name: f.name, + tags: tags, + root: f.root, + } +} + +func (f *fakeLogger) Error(err error, msg string, vals ...interface{}) { + tags := append([]interface{}(nil), f.tags...) + tags = append(tags, "error", err) + tags = append(tags, vals...) + f.root.messages = append(f.root.messages, logInfo{ + name: append([]string(nil), f.name...), + tags: tags, + msg: msg, + }) +} + +func (f *fakeLogger) Info(msg string, vals ...interface{}) { + tags := append([]interface{}(nil), f.tags...) + tags = append(tags, vals...) + f.root.messages = append(f.root.messages, logInfo{ + name: append([]string(nil), f.name...), + tags: tags, + msg: msg, + }) +} + +func (f *fakeLogger) Enabled() bool { return true } +func (f *fakeLogger) V(lvl int) logr.InfoLogger { return f } + +var _ = Describe("Zap logger setup", func() { + Context("with the default output", func() { + It("shouldn't fail when setting up production", func() { + Expect(Logger(false)).NotTo(BeNil()) + }) + + It("shouldn't fail when setting up development", func() { + Expect(Logger(true)).NotTo(BeNil()) + }) + }) + + Context("with custom non-sync output", func() { + It("shouldn't fail when setting up production", func() { + Expect(LoggerTo(ioutil.Discard, false)).NotTo(BeNil()) + }) + + It("shouldn't fail when setting up development", func() { + Expect(LoggerTo(ioutil.Discard, true)).NotTo(BeNil()) + }) + }) + + Context("when logging kubernetes objects", func() { + var logOut *bytes.Buffer + var logger logr.Logger + + BeforeEach(func() { + logOut = new(bytes.Buffer) + By("setting up the logger") + // use production settings (false) to get just json output + logger = LoggerTo(logOut, false) + }) + + It("should log a standard namespaced Kubernetes object name and namespace", func() { + pod := &kapi.Pod{} + pod.Name = "some-pod" + pod.Namespace = "some-ns" + logger.Info("here's a kubernetes object", "thing", pod) + + outRaw := logOut.Bytes() + res := map[string]interface{}{} + Expect(json.Unmarshal(outRaw, &res)).To(Succeed()) + + Expect(res).To(HaveKeyWithValue("thing", map[string]interface{}{ + "name": pod.Name, + "namespace": pod.Namespace, + })) + }) + + It("should work fine with normal stringers", func() { + logger.Info("here's a non-kubernetes stringer", "thing", testStringer{}) + outRaw := logOut.Bytes() + res := map[string]interface{}{} + Expect(json.Unmarshal(outRaw, &res)).To(Succeed()) + + Expect(res).To(HaveKeyWithValue("thing", "value")) + }) + + It("should log a standard non-namespaced Kubernetes object name", func() { + node := &kapi.Node{} + node.Name = "some-node" + logger.Info("here's a kubernetes object", "thing", node) + + outRaw := logOut.Bytes() + res := map[string]interface{}{} + Expect(json.Unmarshal(outRaw, &res)).To(Succeed()) + + Expect(res).To(HaveKeyWithValue("thing", map[string]interface{}{ + "name": node.Name, + })) + }) + + It("should log a standard Kubernetes object's kind, if set", func() { + node := &kapi.Node{} + node.Name = "some-node" + node.APIVersion = "v1" + node.Kind = "Node" + logger.Info("here's a kubernetes object", "thing", node) + + outRaw := logOut.Bytes() + res := map[string]interface{}{} + Expect(json.Unmarshal(outRaw, &res)).To(Succeed()) + + Expect(res).To(HaveKeyWithValue("thing", map[string]interface{}{ + "name": node.Name, + "apiVersion": "v1", + "kind": "Node", + })) + }) + + It("should log a standard non-namespaced NamespacedName name", func() { + name := types.NamespacedName{Name: "some-node"} + logger.Info("here's a kubernetes object", "thing", name) + + outRaw := logOut.Bytes() + res := map[string]interface{}{} + Expect(json.Unmarshal(outRaw, &res)).To(Succeed()) + + Expect(res).To(HaveKeyWithValue("thing", map[string]interface{}{ + "name": name.Name, + })) + }) + + It("should log a standard namespaced NamespacedName name and namespace", func() { + name := types.NamespacedName{Name: "some-pod", Namespace: "some-ns"} + logger.Info("here's a kubernetes object", "thing", name) + + outRaw := logOut.Bytes() + res := map[string]interface{}{} + Expect(json.Unmarshal(outRaw, &res)).To(Succeed()) + + Expect(res).To(HaveKeyWithValue("thing", map[string]interface{}{ + "name": name.Name, + "namespace": name.Namespace, + })) + }) + }) +}) diff --git a/pkg/runtime/log/log.go b/pkg/runtime/log/log.go index 4a50601005..4ad91f456f 100644 --- a/pkg/runtime/log/log.go +++ b/pkg/runtime/log/log.go @@ -16,70 +16,42 @@ limitations under the License. // Package log contains utilities for fetching a new logger // when one is not already available. +// Deprecated: use pkg/log package log import ( - "io" - "os" - "time" - "github.com/go-logr/logr" - "github.com/go-logr/zapr" - "go.uber.org/zap" - "go.uber.org/zap/zapcore" -) - -// ZapLogger is a Logger implementation. -// If development is true, a Zap development config will be used -// (stacktraces on warnings, no sampling), otherwise a Zap production -// config will be used (stacktraces on errors, sampling). -func ZapLogger(development bool) logr.Logger { - return ZapLoggerTo(os.Stderr, development) -} - -// ZapLoggerTo returns a new Logger implementation using Zap which logs -// to the given destination, instead of stderr. It otherise behaves like -// ZapLogger. -func ZapLoggerTo(destWriter io.Writer, development bool) logr.Logger { - // this basically mimics NewConfig, but with a custom sink - sink := zapcore.AddSync(destWriter) - var enc zapcore.Encoder - var lvl zap.AtomicLevel - var opts []zap.Option - if development { - encCfg := zap.NewDevelopmentEncoderConfig() - enc = zapcore.NewConsoleEncoder(encCfg) - lvl = zap.NewAtomicLevelAt(zap.DebugLevel) - opts = append(opts, zap.Development(), zap.AddStacktrace(zap.ErrorLevel)) - } else { - encCfg := zap.NewProductionEncoderConfig() - enc = zapcore.NewJSONEncoder(encCfg) - lvl = zap.NewAtomicLevelAt(zap.InfoLevel) - opts = append(opts, zap.AddStacktrace(zap.WarnLevel), - zap.WrapCore(func(core zapcore.Core) zapcore.Core { - return zapcore.NewSampler(core, time.Second, 100, 100) - })) - } - opts = append(opts, zap.AddCallerSkip(1), zap.ErrorOutput(sink)) - log := zap.New(zapcore.NewCore(&KubeAwareEncoder{Encoder: enc, Verbose: development}, sink, lvl)) - log = log.WithOptions(opts...) - return zapr.NewLogger(log) -} - -// SetLogger sets a concrete logging implementation for all deferred Loggers. -func SetLogger(l logr.Logger) { - Log.Fulfill(l) -} - -// Log is the base logger used by kubebuilder. It delegates -// to another logr.Logger. You *must* call SetLogger to -// get any actual logging. -var Log = NewDelegatingLogger(NullLogger{}) + "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/log/zap" +) -// KBLog is a base parent logger. -var KBLog logr.Logger +var ( + // ZapLogger is a Logger implementation. + // If development is true, a Zap development config will be used + // (stacktraces on warnings, no sampling), otherwise a Zap production + // config will be used (stacktraces on errors, sampling). + ZapLogger = zap.Logger + + // ZapLoggerTo returns a new Logger implementation using Zap which logs + // to the given destination, instead of stderr. It otherise behaves like + // ZapLogger. + ZapLoggerTo = zap.Logger + + // SetLogger sets a concrete logging implementation for all deferred Loggers. + SetLogger = log.SetLogger + + // Log is the base logger used by kubebuilder. It delegates + // to another logr.Logger. You *must* call SetLogger to + // get any actual logging. + Log = log.Log + + // KBLog is a base parent logger for use inside controller-runtime. + // Deprecated: don't use this outside controller-runtime + // (inside CR, use pkg/internal/log.RuntimeLog) + KBLog logr.Logger +) func init() { - KBLog = Log.WithName("kubebuilder") + KBLog = log.Log.WithName("controller-runtime") } From 7207db7426623e065025c3f7e67cf1ce3db78e04 Mon Sep 17 00:00:00 2001 From: Solly Ross Date: Wed, 9 Jan 2019 14:24:53 -0800 Subject: [PATCH 2/3] Switch internals over to new logging pkg layout This switches everything except alias.go over to the new package layout (mainly having internals use pkg/internal/log, and examples use pkg/log). --- TMP-LOGGING.md | 4 ++-- example/main.go | 5 +++-- pkg/builder/builder_suite_test.go | 5 +++-- pkg/builder/example_test.go | 2 +- pkg/cache/cache.go | 4 ++-- pkg/cache/cache_suite_test.go | 5 +++-- pkg/client/client_suite_test.go | 5 +++-- pkg/client/config/config.go | 4 ++-- pkg/client/fake/client.go | 4 ++-- pkg/client/fake/client_suite_test.go | 5 +++-- pkg/controller/controller_suite_test.go | 5 +++-- pkg/controller/controllerutil/example_test.go | 2 +- pkg/controller/example_test.go | 2 +- pkg/envtest/envtest_suite_test.go | 5 +++-- pkg/handler/enqueue.go | 4 ++-- pkg/handler/enqueue_owner.go | 4 ++-- pkg/handler/eventhandler_suite_test.go | 5 +++-- pkg/internal/admission/http.go | 4 ++-- pkg/internal/controller/controller.go | 4 ++-- pkg/internal/controller/controller_suite_test.go | 5 +++-- pkg/internal/recorder/recorder_suite_test.go | 5 +++-- pkg/manager/example_test.go | 2 +- pkg/manager/internal.go | 4 ++-- pkg/manager/manager_suite_test.go | 5 +++-- pkg/predicate/predicate.go | 4 ++-- pkg/predicate/predicate_suite_test.go | 5 +++-- pkg/reconcile/reconcile_suite_test.go | 5 +++-- pkg/source/internal/eventsource.go | 4 ++-- pkg/source/internal/internal_suite_test.go | 5 +++-- pkg/source/source.go | 4 ++-- pkg/source/source_suite_test.go | 5 +++-- pkg/webhook/admission/admission_suite_test.go | 5 +++-- pkg/webhook/admission/doc.go | 4 ++-- pkg/webhook/doc.go | 4 ++-- pkg/webhook/internal/cert/generator/suite_test.go | 5 +++-- pkg/webhook/internal/cert/suite_test.go | 5 +++-- pkg/webhook/internal/cert/writer/doc.go | 4 ++-- pkg/webhook/internal/cert/writer/suite_test.go | 5 +++-- 38 files changed, 91 insertions(+), 72 deletions(-) diff --git a/TMP-LOGGING.md b/TMP-LOGGING.md index a6b6c619b5..2bb5dda888 100644 --- a/TMP-LOGGING.md +++ b/TMP-LOGGING.md @@ -48,11 +48,11 @@ provides some helpers to make it easy to use [Zap](https://go.uber.org/zap) as the implementation. You can configure the logging implementation using -`"sigs.k8s.io/controller-runtime/pkg/runtime/log".SetLogger`. That +`"sigs.k8s.io/controller-runtime/pkg/log".SetLogger`. That package also contains the convinience functions for setting up Zap. You can get a handle to the the "root" logger using -`"sigs.k8s.io/controller-runtime/pkg/runtime/log".Log`, and can then call +`"sigs.k8s.io/controller-runtime/pkg/log".Log`, and can then call `WithName` to create individual named loggers. You can call `WithName` repeatedly to chain names together: diff --git a/example/main.go b/example/main.go index fa3b52b89a..e0af176285 100644 --- a/example/main.go +++ b/example/main.go @@ -29,7 +29,8 @@ import ( "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/handler" "sigs.k8s.io/controller-runtime/pkg/manager" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/log/zap" "sigs.k8s.io/controller-runtime/pkg/runtime/signals" "sigs.k8s.io/controller-runtime/pkg/source" "sigs.k8s.io/controller-runtime/pkg/webhook" @@ -44,7 +45,7 @@ func main() { "disable the installer in the webhook server, so it won't install webhook configuration resources during bootstrapping") flag.Parse() - logf.SetLogger(logf.ZapLogger(false)) + logf.SetLogger(zap.Logger(false)) entryLog := log.WithName("entrypoint") // Setup a Manager diff --git a/pkg/builder/builder_suite_test.go b/pkg/builder/builder_suite_test.go index 39d42eed6e..46ee514ac5 100644 --- a/pkg/builder/builder_suite_test.go +++ b/pkg/builder/builder_suite_test.go @@ -24,7 +24,8 @@ import ( "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/envtest" "sigs.k8s.io/controller-runtime/pkg/metrics" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/log/zap" ) func TestSource(t *testing.T) { @@ -36,7 +37,7 @@ var testenv *envtest.Environment var cfg *rest.Config var _ = BeforeSuite(func(done Done) { - logf.SetLogger(logf.ZapLoggerTo(GinkgoWriter, true)) + logf.SetLogger(zap.LoggerTo(GinkgoWriter, true)) testenv = &envtest.Environment{} diff --git a/pkg/builder/example_test.go b/pkg/builder/example_test.go index a966eed456..00eafb0baf 100644 --- a/pkg/builder/example_test.go +++ b/pkg/builder/example_test.go @@ -21,7 +21,7 @@ import ( "fmt" "os" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/log" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" diff --git a/pkg/cache/cache.go b/pkg/cache/cache.go index cb87d8f385..c6f3e6971f 100644 --- a/pkg/cache/cache.go +++ b/pkg/cache/cache.go @@ -29,10 +29,10 @@ import ( "sigs.k8s.io/controller-runtime/pkg/cache/internal" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/apiutil" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/internal/log" ) -var log = logf.KBLog.WithName("object-cache") +var log = logf.RuntimeLog.WithName("object-cache") // Cache implements CacheReader by reading objects from a cache populated by InformersMap type Cache interface { diff --git a/pkg/cache/cache_suite_test.go b/pkg/cache/cache_suite_test.go index 20736ab22c..1459a9178a 100644 --- a/pkg/cache/cache_suite_test.go +++ b/pkg/cache/cache_suite_test.go @@ -24,7 +24,8 @@ import ( "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/envtest" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/log/zap" ) func TestSource(t *testing.T) { @@ -37,7 +38,7 @@ var cfg *rest.Config var clientset *kubernetes.Clientset var _ = BeforeSuite(func(done Done) { - logf.SetLogger(logf.ZapLoggerTo(GinkgoWriter, true)) + logf.SetLogger(zap.LoggerTo(GinkgoWriter, true)) testenv = &envtest.Environment{} diff --git a/pkg/client/client_suite_test.go b/pkg/client/client_suite_test.go index 0c9cc9d458..dbdafbfa86 100644 --- a/pkg/client/client_suite_test.go +++ b/pkg/client/client_suite_test.go @@ -25,7 +25,8 @@ import ( "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/envtest" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/log/zap" ) func TestSource(t *testing.T) { @@ -38,7 +39,7 @@ var cfg *rest.Config var clientset *kubernetes.Clientset var _ = BeforeSuite(func(done Done) { - logf.SetLogger(logf.ZapLoggerTo(GinkgoWriter, true)) + logf.SetLogger(zap.LoggerTo(GinkgoWriter, true)) testenv = &envtest.Environment{} diff --git a/pkg/client/config/config.go b/pkg/client/config/config.go index a57d48767f..4ca4f20deb 100644 --- a/pkg/client/config/config.go +++ b/pkg/client/config/config.go @@ -25,12 +25,12 @@ import ( "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/internal/log" ) var ( kubeconfig, masterURL string - log = logf.KBLog.WithName("client").WithName("config") + log = logf.RuntimeLog.WithName("client").WithName("config") ) func init() { diff --git a/pkg/client/fake/client.go b/pkg/client/fake/client.go index 09055a5bac..ee5e537b93 100644 --- a/pkg/client/fake/client.go +++ b/pkg/client/fake/client.go @@ -31,11 +31,11 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/apiutil" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/internal/log" ) var ( - log = logf.KBLog.WithName("fake-client") + log = logf.RuntimeLog.WithName("fake-client") ) type fakeClient struct { diff --git a/pkg/client/fake/client_suite_test.go b/pkg/client/fake/client_suite_test.go index 7adea0cdda..7342148c47 100644 --- a/pkg/client/fake/client_suite_test.go +++ b/pkg/client/fake/client_suite_test.go @@ -23,7 +23,8 @@ import ( . "github.com/onsi/gomega" "sigs.k8s.io/controller-runtime/pkg/envtest" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/log/zap" ) func TestSource(t *testing.T) { @@ -32,6 +33,6 @@ func TestSource(t *testing.T) { } var _ = BeforeSuite(func(done Done) { - logf.SetLogger(logf.ZapLoggerTo(GinkgoWriter, true)) + logf.SetLogger(zap.LoggerTo(GinkgoWriter, true)) close(done) }, 60) diff --git a/pkg/controller/controller_suite_test.go b/pkg/controller/controller_suite_test.go index 9749f99cb4..ec730a2168 100644 --- a/pkg/controller/controller_suite_test.go +++ b/pkg/controller/controller_suite_test.go @@ -25,7 +25,8 @@ import ( "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/envtest" "sigs.k8s.io/controller-runtime/pkg/metrics" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/log/zap" ) func TestSource(t *testing.T) { @@ -38,7 +39,7 @@ var cfg *rest.Config var clientset *kubernetes.Clientset var _ = BeforeSuite(func(done Done) { - logf.SetLogger(logf.ZapLoggerTo(GinkgoWriter, true)) + logf.SetLogger(zap.LoggerTo(GinkgoWriter, true)) testenv = &envtest.Environment{} diff --git a/pkg/controller/controllerutil/example_test.go b/pkg/controller/controllerutil/example_test.go index 82bb067916..f340f623fc 100644 --- a/pkg/controller/controllerutil/example_test.go +++ b/pkg/controller/controllerutil/example_test.go @@ -25,7 +25,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/log" ) var ( diff --git a/pkg/controller/example_test.go b/pkg/controller/example_test.go index 2628822075..4c2a0de947 100644 --- a/pkg/controller/example_test.go +++ b/pkg/controller/example_test.go @@ -26,7 +26,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/handler" "sigs.k8s.io/controller-runtime/pkg/manager" "sigs.k8s.io/controller-runtime/pkg/reconcile" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/runtime/signals" "sigs.k8s.io/controller-runtime/pkg/source" ) diff --git a/pkg/envtest/envtest_suite_test.go b/pkg/envtest/envtest_suite_test.go index a8c4c32f3b..46aba52138 100644 --- a/pkg/envtest/envtest_suite_test.go +++ b/pkg/envtest/envtest_suite_test.go @@ -21,7 +21,8 @@ import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/log/zap" ) func TestSource(t *testing.T) { @@ -32,7 +33,7 @@ func TestSource(t *testing.T) { var env *Environment var _ = BeforeSuite(func(done Done) { - logf.SetLogger(logf.ZapLoggerTo(GinkgoWriter, true)) + logf.SetLogger(zap.LoggerTo(GinkgoWriter, true)) env = &Environment{} _, err := env.Start() Expect(err).NotTo(HaveOccurred()) diff --git a/pkg/handler/enqueue.go b/pkg/handler/enqueue.go index 9ddda5be6e..2d0d4a6bda 100644 --- a/pkg/handler/enqueue.go +++ b/pkg/handler/enqueue.go @@ -21,10 +21,10 @@ import ( "k8s.io/client-go/util/workqueue" "sigs.k8s.io/controller-runtime/pkg/event" "sigs.k8s.io/controller-runtime/pkg/reconcile" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/internal/log" ) -var enqueueLog = logf.KBLog.WithName("eventhandler").WithName("EnqueueRequestForObject") +var enqueueLog = logf.RuntimeLog.WithName("eventhandler").WithName("EnqueueRequestForObject") var _ EventHandler = &EnqueueRequestForObject{} diff --git a/pkg/handler/enqueue_owner.go b/pkg/handler/enqueue_owner.go index a5b1076808..2e0b492803 100644 --- a/pkg/handler/enqueue_owner.go +++ b/pkg/handler/enqueue_owner.go @@ -27,12 +27,12 @@ import ( "sigs.k8s.io/controller-runtime/pkg/event" "sigs.k8s.io/controller-runtime/pkg/reconcile" "sigs.k8s.io/controller-runtime/pkg/runtime/inject" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/internal/log" ) var _ EventHandler = &EnqueueRequestForOwner{} -var log = logf.KBLog.WithName("eventhandler").WithName("EnqueueRequestForOwner") +var log = logf.RuntimeLog.WithName("eventhandler").WithName("EnqueueRequestForOwner") // EnqueueRequestForOwner enqueues Requests for the Owners of an object. E.g. the object that created // the object that was the source of the Event. diff --git a/pkg/handler/eventhandler_suite_test.go b/pkg/handler/eventhandler_suite_test.go index ee824d35d0..7fd222e590 100644 --- a/pkg/handler/eventhandler_suite_test.go +++ b/pkg/handler/eventhandler_suite_test.go @@ -22,7 +22,8 @@ import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" "sigs.k8s.io/controller-runtime/pkg/envtest" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/log/zap" ) func TestEventhandler(t *testing.T) { @@ -31,5 +32,5 @@ func TestEventhandler(t *testing.T) { } var _ = BeforeSuite(func() { - logf.SetLogger(logf.ZapLoggerTo(GinkgoWriter, true)) + logf.SetLogger(zap.LoggerTo(GinkgoWriter, true)) }) diff --git a/pkg/internal/admission/http.go b/pkg/internal/admission/http.go index b1ae833108..49ddb4ad16 100644 --- a/pkg/internal/admission/http.go +++ b/pkg/internal/admission/http.go @@ -23,12 +23,12 @@ import ( "k8s.io/api/admission/v1beta1" "k8s.io/apimachinery/pkg/runtime" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/internal/log" ) var ( // TODO(directxman12): this shouldn't be a global log - log = logf.KBLog.WithName("admission").WithName("http-handler") + log = logf.RuntimeLog.WithName("admission").WithName("http-handler") ) func (h httpHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { diff --git a/pkg/internal/controller/controller.go b/pkg/internal/controller/controller.go index 6a44ea9fc3..cbf01de149 100644 --- a/pkg/internal/controller/controller.go +++ b/pkg/internal/controller/controller.go @@ -34,11 +34,11 @@ import ( "sigs.k8s.io/controller-runtime/pkg/predicate" "sigs.k8s.io/controller-runtime/pkg/reconcile" "sigs.k8s.io/controller-runtime/pkg/runtime/inject" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/internal/log" "sigs.k8s.io/controller-runtime/pkg/source" ) -var log = logf.KBLog.WithName("controller") +var log = logf.RuntimeLog.WithName("controller") var _ inject.Injector = &Controller{} diff --git a/pkg/internal/controller/controller_suite_test.go b/pkg/internal/controller/controller_suite_test.go index 9efb85391e..36cb52559f 100644 --- a/pkg/internal/controller/controller_suite_test.go +++ b/pkg/internal/controller/controller_suite_test.go @@ -24,7 +24,8 @@ import ( "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/envtest" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/log/zap" ) func TestSource(t *testing.T) { @@ -37,7 +38,7 @@ var cfg *rest.Config var clientset *kubernetes.Clientset var _ = BeforeSuite(func(done Done) { - logf.SetLogger(logf.ZapLoggerTo(GinkgoWriter, true)) + logf.SetLogger(zap.LoggerTo(GinkgoWriter, true)) testenv = &envtest.Environment{} diff --git a/pkg/internal/recorder/recorder_suite_test.go b/pkg/internal/recorder/recorder_suite_test.go index b8666a3391..d50270604b 100644 --- a/pkg/internal/recorder/recorder_suite_test.go +++ b/pkg/internal/recorder/recorder_suite_test.go @@ -24,7 +24,8 @@ import ( "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/envtest" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/log/zap" ) func TestRecorder(t *testing.T) { @@ -37,7 +38,7 @@ var cfg *rest.Config var clientset *kubernetes.Clientset var _ = BeforeSuite(func(done Done) { - logf.SetLogger(logf.ZapLoggerTo(GinkgoWriter, true)) + logf.SetLogger(zap.LoggerTo(GinkgoWriter, true)) testenv = &envtest.Environment{} diff --git a/pkg/manager/example_test.go b/pkg/manager/example_test.go index 76d585a18d..f718b38f8e 100644 --- a/pkg/manager/example_test.go +++ b/pkg/manager/example_test.go @@ -21,7 +21,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client/config" "sigs.k8s.io/controller-runtime/pkg/manager" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/runtime/signals" ) diff --git a/pkg/manager/internal.go b/pkg/manager/internal.go index fd04e8fb54..f828b2f284 100644 --- a/pkg/manager/internal.go +++ b/pkg/manager/internal.go @@ -36,11 +36,11 @@ import ( "sigs.k8s.io/controller-runtime/pkg/metrics" "sigs.k8s.io/controller-runtime/pkg/recorder" "sigs.k8s.io/controller-runtime/pkg/runtime/inject" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/internal/log" "sigs.k8s.io/controller-runtime/pkg/webhook/admission/types" ) -var log = logf.KBLog.WithName("manager") +var log = logf.RuntimeLog.WithName("manager") type controllerManager struct { // config is the rest.config used to talk to the apiserver. Required. diff --git a/pkg/manager/manager_suite_test.go b/pkg/manager/manager_suite_test.go index b8d8b33f06..a1183f66c0 100644 --- a/pkg/manager/manager_suite_test.go +++ b/pkg/manager/manager_suite_test.go @@ -25,7 +25,8 @@ import ( "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/envtest" "sigs.k8s.io/controller-runtime/pkg/metrics" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/log/zap" ) func TestSource(t *testing.T) { @@ -38,7 +39,7 @@ var cfg *rest.Config var clientset *kubernetes.Clientset var _ = BeforeSuite(func(done Done) { - logf.SetLogger(logf.ZapLoggerTo(GinkgoWriter, true)) + logf.SetLogger(zap.LoggerTo(GinkgoWriter, true)) testenv = &envtest.Environment{} diff --git a/pkg/predicate/predicate.go b/pkg/predicate/predicate.go index 99a4f9d93a..9542d4a1c0 100644 --- a/pkg/predicate/predicate.go +++ b/pkg/predicate/predicate.go @@ -18,10 +18,10 @@ package predicate import ( "sigs.k8s.io/controller-runtime/pkg/event" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/internal/log" ) -var log = logf.KBLog.WithName("predicate").WithName("eventFilters") +var log = logf.RuntimeLog.WithName("predicate").WithName("eventFilters") // Predicate filters events before enqueuing the keys. type Predicate interface { diff --git a/pkg/predicate/predicate_suite_test.go b/pkg/predicate/predicate_suite_test.go index fc8713e40e..15ee76ffef 100644 --- a/pkg/predicate/predicate_suite_test.go +++ b/pkg/predicate/predicate_suite_test.go @@ -22,7 +22,8 @@ import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" "sigs.k8s.io/controller-runtime/pkg/envtest" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/log/zap" ) func TestPredicate(t *testing.T) { @@ -31,5 +32,5 @@ func TestPredicate(t *testing.T) { } var _ = BeforeSuite(func() { - logf.SetLogger(logf.ZapLoggerTo(GinkgoWriter, true)) + logf.SetLogger(zap.LoggerTo(GinkgoWriter, true)) }) diff --git a/pkg/reconcile/reconcile_suite_test.go b/pkg/reconcile/reconcile_suite_test.go index 7c88fb6ab6..f9fbba4b32 100644 --- a/pkg/reconcile/reconcile_suite_test.go +++ b/pkg/reconcile/reconcile_suite_test.go @@ -22,7 +22,8 @@ import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" "sigs.k8s.io/controller-runtime/pkg/envtest" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/log/zap" ) func TestReconcile(t *testing.T) { @@ -31,5 +32,5 @@ func TestReconcile(t *testing.T) { } var _ = BeforeSuite(func() { - logf.SetLogger(logf.ZapLoggerTo(GinkgoWriter, true)) + logf.SetLogger(zap.LoggerTo(GinkgoWriter, true)) }) diff --git a/pkg/source/internal/eventsource.go b/pkg/source/internal/eventsource.go index 6ced9f4eff..ae220fc882 100644 --- a/pkg/source/internal/eventsource.go +++ b/pkg/source/internal/eventsource.go @@ -25,13 +25,13 @@ import ( "k8s.io/client-go/util/workqueue" "sigs.k8s.io/controller-runtime/pkg/event" "sigs.k8s.io/controller-runtime/pkg/handler" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/internal/log" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/predicate" ) -var log = logf.KBLog.WithName("source").WithName("EventHandler") +var log = logf.RuntimeLog.WithName("source").WithName("EventHandler") var _ cache.ResourceEventHandler = EventHandler{} diff --git a/pkg/source/internal/internal_suite_test.go b/pkg/source/internal/internal_suite_test.go index 866df19cd2..53848f2db7 100644 --- a/pkg/source/internal/internal_suite_test.go +++ b/pkg/source/internal/internal_suite_test.go @@ -22,7 +22,8 @@ import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" "sigs.k8s.io/controller-runtime/pkg/envtest" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/log/zap" ) func TestInternal(t *testing.T) { @@ -31,5 +32,5 @@ func TestInternal(t *testing.T) { } var _ = BeforeSuite(func() { - logf.SetLogger(logf.ZapLoggerTo(GinkgoWriter, true)) + logf.SetLogger(zap.LoggerTo(GinkgoWriter, true)) }) diff --git a/pkg/source/source.go b/pkg/source/source.go index cd7bef798f..3375616e1d 100644 --- a/pkg/source/source.go +++ b/pkg/source/source.go @@ -26,7 +26,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/event" "sigs.k8s.io/controller-runtime/pkg/handler" "sigs.k8s.io/controller-runtime/pkg/runtime/inject" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/internal/log" "sigs.k8s.io/controller-runtime/pkg/source/internal" toolscache "k8s.io/client-go/tools/cache" @@ -34,7 +34,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/predicate" ) -var log = logf.KBLog.WithName("source") +var log = logf.RuntimeLog.WithName("source") const ( // defaultBufferSize is the default number of event notifications that can be buffered. diff --git a/pkg/source/source_suite_test.go b/pkg/source/source_suite_test.go index ccd6697ba0..0a45a0e1b1 100644 --- a/pkg/source/source_suite_test.go +++ b/pkg/source/source_suite_test.go @@ -25,7 +25,8 @@ import ( "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/cache" "sigs.k8s.io/controller-runtime/pkg/envtest" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/log/zap" ) func TestSource(t *testing.T) { @@ -41,7 +42,7 @@ var stop chan struct{} var _ = BeforeSuite(func(done Done) { stop = make(chan struct{}) - logf.SetLogger(logf.ZapLoggerTo(GinkgoWriter, true)) + logf.SetLogger(zap.LoggerTo(GinkgoWriter, true)) testenv = &envtest.Environment{} diff --git a/pkg/webhook/admission/admission_suite_test.go b/pkg/webhook/admission/admission_suite_test.go index 6d34d165a4..42323177e6 100644 --- a/pkg/webhook/admission/admission_suite_test.go +++ b/pkg/webhook/admission/admission_suite_test.go @@ -23,7 +23,8 @@ import ( . "github.com/onsi/gomega" "sigs.k8s.io/controller-runtime/pkg/envtest" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/log/zap" ) func TestAdmissionWebhook(t *testing.T) { @@ -32,7 +33,7 @@ func TestAdmissionWebhook(t *testing.T) { } var _ = BeforeSuite(func(done Done) { - logf.SetLogger(logf.ZapLoggerTo(GinkgoWriter, true)) + logf.SetLogger(zap.LoggerTo(GinkgoWriter, true)) close(done) }, 60) diff --git a/pkg/webhook/admission/doc.go b/pkg/webhook/admission/doc.go index 44a2b15294..0126aad03a 100644 --- a/pkg/webhook/admission/doc.go +++ b/pkg/webhook/admission/doc.go @@ -95,7 +95,7 @@ The following snippet is an example implementation of validating handler. package admission import ( - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/internal/log" ) -var log = logf.KBLog.WithName("admission") +var log = logf.RuntimeLog.WithName("admission") diff --git a/pkg/webhook/doc.go b/pkg/webhook/doc.go index 2c9eba2a3d..930df1e436 100644 --- a/pkg/webhook/doc.go +++ b/pkg/webhook/doc.go @@ -88,7 +88,7 @@ Start the server by starting the manager package webhook import ( - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/internal/log" ) -var log = logf.KBLog.WithName("webhook") +var log = logf.RuntimeLog.WithName("webhook") diff --git a/pkg/webhook/internal/cert/generator/suite_test.go b/pkg/webhook/internal/cert/generator/suite_test.go index 89af8a8562..1b232a6525 100644 --- a/pkg/webhook/internal/cert/generator/suite_test.go +++ b/pkg/webhook/internal/cert/generator/suite_test.go @@ -23,7 +23,8 @@ import ( . "github.com/onsi/gomega" "sigs.k8s.io/controller-runtime/pkg/envtest" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/log/zap" ) func TestSource(t *testing.T) { @@ -32,6 +33,6 @@ func TestSource(t *testing.T) { } var _ = BeforeSuite(func(done Done) { - logf.SetLogger(logf.ZapLoggerTo(GinkgoWriter, true)) + logf.SetLogger(zap.LoggerTo(GinkgoWriter, true)) close(done) }, 60) diff --git a/pkg/webhook/internal/cert/suite_test.go b/pkg/webhook/internal/cert/suite_test.go index 98064687ab..6762ada6a5 100644 --- a/pkg/webhook/internal/cert/suite_test.go +++ b/pkg/webhook/internal/cert/suite_test.go @@ -23,7 +23,8 @@ import ( . "github.com/onsi/gomega" "sigs.k8s.io/controller-runtime/pkg/envtest" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/log/zap" ) func TestSource(t *testing.T) { @@ -32,6 +33,6 @@ func TestSource(t *testing.T) { } var _ = BeforeSuite(func(done Done) { - logf.SetLogger(logf.ZapLoggerTo(GinkgoWriter, true)) + logf.SetLogger(zap.LoggerTo(GinkgoWriter, true)) close(done) }, 60) diff --git a/pkg/webhook/internal/cert/writer/doc.go b/pkg/webhook/internal/cert/writer/doc.go index 91aa07ae4a..425626606c 100644 --- a/pkg/webhook/internal/cert/writer/doc.go +++ b/pkg/webhook/internal/cert/writer/doc.go @@ -58,7 +58,7 @@ Inject necessary information given the objects. package writer import ( - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/internal/log" ) -var log = logf.KBLog.WithName("admission").WithName("cert").WithName("writer") +var log = logf.RuntimeLog.WithName("admission").WithName("cert").WithName("writer") diff --git a/pkg/webhook/internal/cert/writer/suite_test.go b/pkg/webhook/internal/cert/writer/suite_test.go index 67b96bca82..968ca8b67a 100644 --- a/pkg/webhook/internal/cert/writer/suite_test.go +++ b/pkg/webhook/internal/cert/writer/suite_test.go @@ -23,7 +23,8 @@ import ( . "github.com/onsi/gomega" "sigs.k8s.io/controller-runtime/pkg/envtest" - logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/log/zap" ) func TestSource(t *testing.T) { @@ -32,6 +33,6 @@ func TestSource(t *testing.T) { } var _ = BeforeSuite(func(done Done) { - logf.SetLogger(logf.ZapLoggerTo(GinkgoWriter, true)) + logf.SetLogger(zap.LoggerTo(GinkgoWriter, true)) close(done) }, 60) From 3c5adf4d935488e9fcc9c3ff70c550a5e9178223 Mon Sep 17 00:00:00 2001 From: Solly Ross Date: Wed, 9 Jan 2019 14:26:52 -0800 Subject: [PATCH 3/3] Switch alias.go to new logging pkg layout This switches alias.go over to the new logging layout. In order to avoid alias.go pulling in Zap, we don't put ZapLogger in alias.go any more. Practically, this is probably fine. It means an extra line in main.go, but it's just one, and allows people to avoid extraneous dependencies. --- alias.go | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/alias.go b/alias.go index d5a21b1f38..da85ceeb28 100644 --- a/alias.go +++ b/alias.go @@ -26,7 +26,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "sigs.k8s.io/controller-runtime/pkg/manager" "sigs.k8s.io/controller-runtime/pkg/reconcile" - "sigs.k8s.io/controller-runtime/pkg/runtime/log" + "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/runtime/scheme" "sigs.k8s.io/controller-runtime/pkg/runtime/signals" ) @@ -126,10 +126,4 @@ var ( // SetLogger sets a concrete logging implementation for all deferred Loggers. SetLogger = log.SetLogger - - // ZapLogger is a Logger implementation. - // If development is true, a Zap development config will be used - // (stacktraces on warnings, no sampling), otherwise a Zap production - // config will be used (stacktraces on errors, sampling). - ZapLogger = log.ZapLogger )