-
Notifications
You must be signed in to change notification settings - Fork 138
/
logger.go
81 lines (64 loc) · 1.99 KB
/
logger.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
package logd
import (
"io"
"os"
"sync"
"github.com/go-logr/logr"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
ctrlzap "sigs.k8s.io/controller-runtime/pkg/log/zap"
)
const (
LogLevelEnv = "LOG_LEVEL"
debugLogLevelElevation = 1
)
var (
baseLogger Logger
baseLoggerOnce sync.Once
)
// Get returns a new, unnamed logd configured with the basics we need for operator logs which can be used as a blueprint for
// derived loggers int the operator components.
func Get() Logger {
baseLoggerOnce.Do(func() {
logLevel := readLogLevelFromEnv()
baseLogger = createLogger(NewPrettyLogWriter(), logLevel)
baseLogger.Info("logging level", "logLevel", logLevel.String())
})
return baseLogger
}
func createLogger(out io.Writer, logLevel zapcore.Level) Logger {
// It's important to create only one "main" logd to avoid excessive memory usage, creating a full logd is rather expensive,
// deriving other loggers by WithName is rather cheap
config := zap.NewProductionEncoderConfig()
config.EncodeTime = zapcore.ISO8601TimeEncoder
config.StacktraceKey = stacktraceKey
return Logger{
ctrlzap.New(ctrlzap.WriteTo(out), ctrlzap.Encoder(zapcore.NewJSONEncoder(config)), ctrlzap.Level(logLevel)),
}
}
func readLogLevelFromEnv() zapcore.Level {
envLevel := os.Getenv(LogLevelEnv)
level, err := zapcore.ParseLevel(envLevel)
if err != nil {
level = zapcore.InfoLevel
}
return level
}
type Logger struct {
logr.Logger
}
// Debug can be used for verbose output that is supposed to be valuable for troubleshooting
func (l *Logger) Debug(message string, keysAndValues ...any) {
kv := make([]any, 0)
kv = append(kv, keysAndValues...)
l.debugLog(message, kv...)
}
func (l Logger) WithName(name string) Logger {
return Logger{l.Logger.WithName(name)}
}
func (l Logger) WithValues(keysAndValues ...any) Logger {
return Logger{l.Logger.WithValues(keysAndValues...)}
}
func (l *Logger) debugLog(message string, keysAndValues ...any) {
l.Logger.V(debugLogLevelElevation).Info(message, keysAndValues...)
}