Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/pkg/operator/logutil/log.go
4094 views
1
// Package logutil implements an adaptor for the go-kit logger, which is used in the
2
// Grafana Agent project, and go-logr, which is used in controller-runtime.
3
package logutil
4
5
import (
6
"context"
7
"fmt"
8
9
"github.com/go-kit/log"
10
"github.com/go-kit/log/level"
11
"github.com/go-logr/logr"
12
"k8s.io/klog/v2"
13
clog "sigs.k8s.io/controller-runtime/pkg/log"
14
)
15
16
// Wrap wraps a log.Logger into a logr.Logger.
17
func Wrap(l log.Logger) logr.Logger {
18
return logr.New(&goKitLogger{l: l})
19
}
20
21
// FromContext returns a log.Logger from a context. Panics if the context doesn't
22
// have a Logger set.
23
func FromContext(ctx context.Context, kvps ...interface{}) log.Logger {
24
gkl := clog.FromContext(ctx, kvps...).GetSink().(*goKitLogger)
25
return gkl.namedLogger()
26
}
27
28
type goKitLogger struct {
29
// name is a name field used by logr which can be appended to dynamically.
30
name string
31
kvps []interface{}
32
l log.Logger
33
}
34
35
var _ logr.LogSink = (*goKitLogger)(nil)
36
37
func (l *goKitLogger) Init(info logr.RuntimeInfo) {
38
// no-op
39
}
40
41
func (l *goKitLogger) Enabled(level int) bool { return true }
42
43
func (l *goKitLogger) Info(logLevel int, msg string, keysAndValues ...interface{}) {
44
args := append([]interface{}{"msg", msg}, keysAndValues...)
45
level.Info(l.namedLogger()).Log(args...)
46
}
47
48
func (l *goKitLogger) Error(err error, msg string, keysAndValues ...interface{}) {
49
args := append([]interface{}{"msg", msg, "err", err}, keysAndValues...)
50
level.Error(l.namedLogger()).Log(args...)
51
}
52
53
func (l *goKitLogger) WithValues(keysAndValues ...interface{}) logr.LogSink {
54
// fix for logs showing "unsupported value type for object references"
55
if len(keysAndValues) == 2 {
56
if v, ok := keysAndValues[1].(klog.ObjectRef); ok {
57
keysAndValues[1] = fmt.Sprintf("%s/%s", v.Namespace, v.Name)
58
}
59
}
60
return &goKitLogger{name: l.name, l: l.l, kvps: append(l.kvps, keysAndValues...)}
61
}
62
63
// namedLogger gets log.Logger with component applied.
64
func (l *goKitLogger) namedLogger() log.Logger {
65
logger := l.l
66
if l.name != "" {
67
logger = log.With(logger, "component", l.name)
68
}
69
logger = log.With(logger, l.kvps...)
70
return logger
71
}
72
73
func (l *goKitLogger) WithName(name string) logr.LogSink {
74
newName := name
75
if l.name != "" {
76
newName = l.name + "." + name
77
}
78
return &goKitLogger{name: newName, l: l.l}
79
}
80
81