pkg/datasource/k8s/log_adapter.go (93 lines of code) (raw):
package k8s
import (
"strings"
"github.com/alibaba/sentinel-golang/logging"
"github.com/go-logr/logr"
)
// noopInfoLogger is a logr.InfoLogger that's always disabled, and does nothing.
type noopInfoLogger struct{}
func (l *noopInfoLogger) Enabled() bool { return false }
func (l *noopInfoLogger) Info(_ string, _ ...interface{}) {}
var disabledInfoLogger = &noopInfoLogger{}
type k8SLogger struct {
l logging.Logger
level logging.Level
names []string
keysAndValues []interface{}
}
func (k *k8SLogger) buildNames() string {
size := len(k.names)
if size == 0 {
return ""
}
sb := strings.Builder{}
for i, name := range k.names {
sb.WriteString(name)
if i == size-1 {
continue
}
sb.WriteString(".")
}
sb.WriteString(" ")
return sb.String()
}
func (k *k8SLogger) Info(msg string, keysAndValues ...interface{}) {
keysAndValues = append(keysAndValues, k.keysAndValues...)
switch k.level {
case logging.WarnLevel:
k.l.Warn(k.buildNames()+msg, keysAndValues...)
case logging.InfoLevel:
k.l.Info(k.buildNames()+msg, keysAndValues...)
case logging.DebugLevel:
k.l.Debug(k.buildNames()+msg, keysAndValues...)
default:
k.l.Info(k.buildNames()+msg, keysAndValues...)
}
}
func (k *k8SLogger) Enabled() bool {
return true
}
func (k *k8SLogger) Error(err error, msg string, keysAndValues ...interface{}) {
keysAndValues = append(keysAndValues, k.keysAndValues...)
k.l.Error(err, k.buildNames()+msg, keysAndValues...)
}
func (k *k8SLogger) V(level int) logr.InfoLogger {
if k.Enabled() {
names := make([]string, len(k.names))
copy(names, k.names)
kvs := make([]interface{}, len(k.keysAndValues))
copy(kvs, k.keysAndValues)
return &k8SLogger{
l: k.l,
level: logging.Level(level),
names: names,
keysAndValues: kvs,
}
}
return disabledInfoLogger
}
func (k *k8SLogger) WithValues(keysAndValues ...interface{}) logr.Logger {
names := make([]string, len(k.names))
copy(names, k.names)
kvs := make([]interface{}, len(k.keysAndValues))
copy(kvs, k.keysAndValues)
kvs = append(kvs, keysAndValues...)
return &k8SLogger{
l: k.l,
level: k.level,
names: names,
keysAndValues: kvs,
}
}
func (k *k8SLogger) WithName(name string) logr.Logger {
names := make([]string, len(k.names))
copy(names, k.names)
names = append(names, name)
kvs := make([]interface{}, len(k.keysAndValues))
copy(kvs, k.keysAndValues)
return &k8SLogger{
l: k.l,
level: k.level,
names: names,
keysAndValues: kvs,
}
}