@@ -23,27 +23,41 @@ import (
23
23
"k8s.io/apimachinery/pkg/types"
24
24
)
25
25
26
+ var _ logr.LogSink = (* KubeAwareLogSink )(nil )
27
+
28
+ // KubeAwareLogSink is a Kubernetes-aware logr.LogSink.
29
+ // zapcore.ObjectMarshaler would be bypassed when using zapr and WithValues.
30
+ // It would use a wrapper implements logr.Marshaler instead of using origin Kubernetes objects.
26
31
type KubeAwareLogSink struct {
27
32
sink logr.LogSink
28
33
kubeAwareEnabled * atomic.Bool
29
34
}
30
35
36
+ // NewKubeAwareLogger return the wrapper with existed logr.Logger.
37
+ // logger is the backend logger.
38
+ // kubeAwareEnabled is the flag to enable kube aware logging.
31
39
func NewKubeAwareLogger (logger logr.Logger , kubeAwareEnabled bool ) logr.Logger {
32
40
return logr .New (NewKubeAwareLogSink (logger .GetSink (), kubeAwareEnabled ))
33
41
}
34
42
43
+ // NewKubeAwareLogSink return the wrapper with existed logr.LogSink.
44
+ // sink is the backend logr.LogSink.
45
+ // kubeAwareEnabled is the flag to enable kube aware logging.
35
46
func NewKubeAwareLogSink (logSink logr.LogSink , kubeAwareEnabled bool ) * KubeAwareLogSink {
36
47
return & KubeAwareLogSink {sink : logSink , kubeAwareEnabled : atomic .NewBool (kubeAwareEnabled )}
37
48
}
38
49
50
+ // Init implements logr.LogSink.
39
51
func (k * KubeAwareLogSink ) Init (info logr.RuntimeInfo ) {
40
52
k .sink .Init (info )
41
53
}
42
54
55
+ // Enabled implements logr.LogSink.
43
56
func (k * KubeAwareLogSink ) Enabled (level int ) bool {
44
57
return k .sink .Enabled (level )
45
58
}
46
59
60
+ // Info implements logr.LogSink.
47
61
func (k * KubeAwareLogSink ) Info (level int , msg string , keysAndValues ... interface {}) {
48
62
if ! k .KubeAwareEnabled () {
49
63
k .sink .Info (level , msg , keysAndValues ... )
@@ -53,6 +67,7 @@ func (k *KubeAwareLogSink) Info(level int, msg string, keysAndValues ...interfac
53
67
k .sink .Info (level , msg , k .wrapKeyAndValues (keysAndValues )... )
54
68
}
55
69
70
+ // Error implements logr.LogSink.
56
71
func (k * KubeAwareLogSink ) Error (err error , msg string , keysAndValues ... interface {}) {
57
72
if ! k .KubeAwareEnabled () {
58
73
k .sink .Error (err , msg , keysAndValues ... )
@@ -61,45 +76,50 @@ func (k *KubeAwareLogSink) Error(err error, msg string, keysAndValues ...interfa
61
76
k .sink .Error (err , msg , k .wrapKeyAndValues (keysAndValues )... )
62
77
}
63
78
64
- func (k * KubeAwareLogSink ) wrapKeyAndValues (keysAndValues []interface {}) []interface {} {
65
- result := make ([]interface {}, len (keysAndValues ))
66
- for i , item := range keysAndValues {
67
- if i % 2 == 0 {
68
- // item is key, no need to resolve
69
- result [i ] = item
70
- continue
71
- }
72
-
73
- switch val := item .(type ) {
74
- case runtime.Object :
75
- result [i ] = & kubeObjectWrapper {obj : val }
76
- case types.NamespacedName :
77
- result [i ] = & namespacedNameWrapper {NamespacedName : val }
78
- default :
79
- result [i ] = item
80
- }
81
- }
82
- return result
83
- }
84
-
79
+ // WithValues implements logr.LogSink.
85
80
func (k * KubeAwareLogSink ) WithValues (keysAndValues ... interface {}) logr.LogSink {
86
81
return & KubeAwareLogSink {
87
82
kubeAwareEnabled : k .kubeAwareEnabled ,
88
83
sink : k .sink .WithValues (k .wrapKeyAndValues (keysAndValues )... ),
89
84
}
90
85
}
91
86
87
+ // WithName implements logr.LogSink.
92
88
func (k * KubeAwareLogSink ) WithName (name string ) logr.LogSink {
93
89
return & KubeAwareLogSink {
94
90
kubeAwareEnabled : k .kubeAwareEnabled ,
95
91
sink : k .sink .WithName (name ),
96
92
}
97
93
}
98
94
95
+ // KubeAwareEnabled return kube aware logging is enabled or not.
99
96
func (k * KubeAwareLogSink ) KubeAwareEnabled () bool {
100
97
return k .kubeAwareEnabled .Load ()
101
98
}
102
99
100
+ // SetKubeAwareEnabled could update the kube aware logging flag.
103
101
func (k * KubeAwareLogSink ) SetKubeAwareEnabled (enabled bool ) {
104
102
k .kubeAwareEnabled .Store (enabled )
105
103
}
104
+
105
+ // wrapKeyAndValues would replace the kubernetes objects with wrappers.
106
+ func (k * KubeAwareLogSink ) wrapKeyAndValues (keysAndValues []interface {}) []interface {} {
107
+ result := make ([]interface {}, len (keysAndValues ))
108
+ for i , item := range keysAndValues {
109
+ if i % 2 == 0 {
110
+ // item is key, no need to resolve
111
+ result [i ] = item
112
+ continue
113
+ }
114
+
115
+ switch val := item .(type ) {
116
+ case runtime.Object :
117
+ result [i ] = & kubeObjectWrapper {obj : val }
118
+ case types.NamespacedName :
119
+ result [i ] = & namespacedNameWrapper {NamespacedName : val }
120
+ default :
121
+ result [i ] = item
122
+ }
123
+ }
124
+ return result
125
+ }
0 commit comments