mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
add feature toggle with new format (#47336)
* add feature toggle with new format
* fix some comments ❤️
* Update pkg/infra/log/term/terminal_logger.go
Co-authored-by: Emil Tullstedt <emil.tullstedt@grafana.com>
Co-authored-by: Emil Tullstedt <emil.tullstedt@grafana.com>
This commit is contained in:
parent
fb0f30e30b
commit
03ba91e8a4
@ -196,6 +196,14 @@ var (
|
||||
debugValue = &levelValue{level: levelDebug, name: "dbug"}
|
||||
)
|
||||
|
||||
func SetLevelKeyAndValuesToGokitLog() {
|
||||
key = "level"
|
||||
errorValue = &levelValue{level: levelError, name: "error"}
|
||||
warnValue = &levelValue{level: levelWarn, name: "warn"}
|
||||
infoValue = &levelValue{level: levelInfo, name: "info"}
|
||||
debugValue = &levelValue{level: levelDebug, name: "debug"}
|
||||
}
|
||||
|
||||
type level byte
|
||||
|
||||
const (
|
||||
|
@ -11,6 +11,7 @@ import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
@ -30,6 +31,7 @@ var (
|
||||
loggersToReload []ReloadableHandler
|
||||
root *logManager
|
||||
now = time.Now
|
||||
logTimeFormat = "2006-01-02T15:04:05.99-0700"
|
||||
)
|
||||
|
||||
const (
|
||||
@ -53,9 +55,10 @@ func init() {
|
||||
// logManager manage loggers
|
||||
type logManager struct {
|
||||
*ConcreteLogger
|
||||
loggersByName map[string]*ConcreteLogger
|
||||
logFilters []logWithFilters
|
||||
mutex sync.RWMutex
|
||||
loggersByName map[string]*ConcreteLogger
|
||||
logFilters []logWithFilters
|
||||
mutex sync.RWMutex
|
||||
gokitLogActivated bool
|
||||
}
|
||||
|
||||
func newManager(logger gokitlog.Logger) *logManager {
|
||||
@ -69,6 +72,12 @@ func (lm *logManager) initialize(loggers []logWithFilters) {
|
||||
lm.mutex.Lock()
|
||||
defer lm.mutex.Unlock()
|
||||
|
||||
if lm.gokitLogActivated {
|
||||
level.SetLevelKeyAndValuesToGokitLog()
|
||||
term.SetTimeFormatGokitLog()
|
||||
logTimeFormat = time.RFC3339Nano
|
||||
}
|
||||
|
||||
defaultLoggers := make([]gokitlog.Logger, len(loggers))
|
||||
for index, logger := range loggers {
|
||||
defaultLoggers[index] = level.NewFilter(logger.val, logger.maxLevel)
|
||||
@ -181,7 +190,7 @@ func (cl *ConcreteLogger) Info(msg string, args ...interface{}) {
|
||||
}
|
||||
|
||||
func (cl *ConcreteLogger) log(msg string, logLevel level.Value, args ...interface{}) error {
|
||||
logger := gokitlog.With(&cl.SwapLogger, "t", gokitlog.TimestampFormat(now, "2006-01-02T15:04:05.99-0700"))
|
||||
logger := gokitlog.With(&cl.SwapLogger, "t", gokitlog.TimestampFormat(now, logTimeFormat))
|
||||
args = append([]interface{}{level.Key(), logLevel, "msg", msg}, args...)
|
||||
|
||||
return logger.Log(args...)
|
||||
@ -436,9 +445,55 @@ func ReadLoggingConfig(modes []string, logsPath string, cfg *ini.File) error {
|
||||
configLoggers = append(configLoggers, handler)
|
||||
}
|
||||
|
||||
var err error
|
||||
root.gokitLogActivated, err = isNewLoggerActivated(cfg)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if len(configLoggers) > 0 {
|
||||
root.initialize(configLoggers)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// This would be removed eventually, no need to make a fancy design.
|
||||
// For the sake of important cycle I just copied the function
|
||||
func isNewLoggerActivated(cfg *ini.File) (bool, error) {
|
||||
section := cfg.Section("feature_toggles")
|
||||
toggles, err := readFeatureTogglesFromInitFile(section)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
return toggles["newlog"], nil
|
||||
}
|
||||
|
||||
func readFeatureTogglesFromInitFile(featureTogglesSection *ini.Section) (map[string]bool, error) {
|
||||
featureToggles := make(map[string]bool, 10)
|
||||
|
||||
// parse the comma separated list in `enable`.
|
||||
featuresTogglesStr := valueAsString(featureTogglesSection, "enable", "")
|
||||
for _, feature := range util.SplitString(featuresTogglesStr) {
|
||||
featureToggles[feature] = true
|
||||
}
|
||||
|
||||
// read all other settings under [feature_toggles]. If a toggle is
|
||||
// present in both the value in `enable` is overridden.
|
||||
for _, v := range featureTogglesSection.Keys() {
|
||||
if v.Name() == "enable" {
|
||||
continue
|
||||
}
|
||||
|
||||
b, err := strconv.ParseBool(v.Value())
|
||||
if err != nil {
|
||||
return featureToggles, err
|
||||
}
|
||||
|
||||
featureToggles[v.Name()] = b
|
||||
}
|
||||
return featureToggles, nil
|
||||
}
|
||||
|
||||
func valueAsString(section *ini.Section, keyName string, defaultValue string) string {
|
||||
return section.Key(keyName).MustString(defaultValue)
|
||||
}
|
||||
|
@ -14,14 +14,22 @@ import (
|
||||
"github.com/grafana/grafana/pkg/infra/log/level"
|
||||
)
|
||||
|
||||
const (
|
||||
var (
|
||||
timeFormat = "2006-01-02T15:04:05-0700"
|
||||
termTimeFormat = "01-02|15:04:05"
|
||||
floatFormat = 'f'
|
||||
termMsgJust = 40
|
||||
errorKey = "LOG15_ERROR"
|
||||
)
|
||||
|
||||
const (
|
||||
floatFormat = 'f'
|
||||
termMsgJust = 40
|
||||
errorKey = "LOG15_ERROR"
|
||||
)
|
||||
|
||||
func SetTimeFormatGokitLog() {
|
||||
timeFormat = "2006-01-02T15:04:05.000-0700"
|
||||
termTimeFormat = "01-02|15:04:05.000"
|
||||
}
|
||||
|
||||
type terminalLogger struct {
|
||||
w io.Writer
|
||||
}
|
||||
@ -45,7 +53,10 @@ func (l terminalLogger) Log(keyvals ...interface{}) error {
|
||||
r := getRecord(keyvals)
|
||||
|
||||
b := &bytes.Buffer{}
|
||||
lvl := strings.ToUpper(r.level.String())
|
||||
|
||||
// To make the log output more readable, we make all log levels 5 characters long
|
||||
lvl := fmt.Sprintf("%-5s", strings.ToUpper(r.level.String()))
|
||||
|
||||
if r.color > 0 {
|
||||
fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%s] %s ", r.color, lvl, r.time.Format(termTimeFormat), r.msg) // lgtm[go/log-injection]
|
||||
} else {
|
||||
|
Loading…
Reference in New Issue
Block a user