This repository has been archived by the owner on May 13, 2024. It is now read-only.
/
zaplogr.go
97 lines (79 loc) · 2.65 KB
/
zaplogr.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/* SPDX-License-Identifier: Apache-2.0
*
* Copyright 2023 Damian Peckett <damian@pecke.tt>.
*
* 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 zaplogr provides a way to use zap.Logger with controller-runtime.
package zaplogr
import (
"context"
"github.com/go-logr/logr"
"github.com/go-logr/zapr"
"go.uber.org/zap"
"k8s.io/klog/v2"
"sigs.k8s.io/controller-runtime/pkg/log"
)
// FromContext returns the underlying zap.Logger from a context.
func FromContext(ctx context.Context) *zap.Logger {
logrLogger := log.FromContext(ctx)
if zapLogger, ok := logrLogger.GetSink().(zapr.Underlier); ok {
return zapLogger.GetUnderlying()
}
panic("logger is not a zap logger")
}
// FilteringSink is a logr.LogSink that replaces klog.ObjectRef
// with its string representation.
type FilteringSink struct {
logr.LogSink
}
// New returns a new logr.Logger that's backed by a zap.Logger.
func New(zapLog *zap.Logger) logr.Logger {
return logr.New(&FilteringSink{
LogSink: zapr.NewLogger(zapLog).GetSink(),
})
}
func (f *FilteringSink) Info(level int, msg string, keysAndValues ...any) {
keysAndValues = f.replaceObjectRef(keysAndValues...)
f.LogSink.Info(level, msg, keysAndValues...)
}
func (f *FilteringSink) Error(err error, msg string, keysAndValues ...any) {
keysAndValues = f.replaceObjectRef(keysAndValues...)
f.LogSink.Error(err, msg, keysAndValues...)
}
func (f *FilteringSink) WithValues(keysAndValues ...any) logr.LogSink {
keysAndValues = f.replaceObjectRef(keysAndValues...)
return &FilteringSink{
LogSink: f.LogSink.WithValues(keysAndValues...),
}
}
func (f *FilteringSink) WithName(name string) logr.LogSink {
return &FilteringSink{
LogSink: f.LogSink.WithName(name),
}
}
func (f *FilteringSink) GetUnderlying() *zap.Logger {
if zapLogger, ok := f.LogSink.(zapr.Underlier); ok {
return zapLogger.GetUnderlying()
}
panic("logger is not a zap logger")
}
func (f *FilteringSink) replaceObjectRef(keysAndValues ...any) []any {
for i := 0; i < len(keysAndValues); i += 2 {
// klog objects are not serializable with zap.
if v, ok := keysAndValues[i+1].(klog.ObjectRef); ok {
keysAndValues[i+1] = v.String()
}
}
return keysAndValues
}