|
|
@@ -90,21 +90,40 @@ var logLevels = map[string]log15.Lvl{
|
|
|
"Critical": log15.LvlCrit,
|
|
|
}
|
|
|
|
|
|
-func getLogLevel(key string, defaultName string, cfg *ini.File) (string, log15.Lvl) {
|
|
|
+func getLogLevelFromConfig(key string, defaultName string, cfg *ini.File) (string, log15.Lvl) {
|
|
|
levelName := cfg.Section(key).Key("level").In(defaultName, []string{"Trace", "Debug", "Info", "Warn", "Error", "Critical"})
|
|
|
+ level := getLogLevelFromString(levelName)
|
|
|
+ return levelName, level
|
|
|
+}
|
|
|
|
|
|
+func getLogLevelFromString(levelName string) log15.Lvl {
|
|
|
level, ok := logLevels[levelName]
|
|
|
+
|
|
|
if !ok {
|
|
|
Root.Error("Unknown log level", "level", levelName)
|
|
|
+ return log15.LvlError
|
|
|
}
|
|
|
|
|
|
- return levelName, level
|
|
|
+ return level
|
|
|
+}
|
|
|
+
|
|
|
+func getFilters(filterStrArray []string) map[string]log15.Lvl {
|
|
|
+ filterMap := make(map[string]log15.Lvl)
|
|
|
+
|
|
|
+ for _, filterStr := range filterStrArray {
|
|
|
+ parts := strings.Split(filterStr, ":")
|
|
|
+ filterMap[parts[0]] = getLogLevelFromString(parts[1])
|
|
|
+ }
|
|
|
+
|
|
|
+ return filterMap
|
|
|
}
|
|
|
|
|
|
func ReadLoggingConfig(modes []string, logsPath string, cfg *ini.File) {
|
|
|
Close()
|
|
|
|
|
|
- defaultLevelName, _ := getLogLevel("log", "Info", cfg)
|
|
|
+ defaultLevelName, _ := getLogLevelFromConfig("log", "Info", cfg)
|
|
|
+ defaultFilters := getFilters(cfg.Section("log").Key("filters").Strings(" "))
|
|
|
+
|
|
|
handlers := make([]log15.Handler, 0)
|
|
|
|
|
|
for _, mode := range modes {
|
|
|
@@ -115,12 +134,15 @@ func ReadLoggingConfig(modes []string, logsPath string, cfg *ini.File) {
|
|
|
}
|
|
|
|
|
|
// Log level.
|
|
|
- _, level := getLogLevel("log."+mode, defaultLevelName, cfg)
|
|
|
+ _, level := getLogLevelFromConfig("log."+mode, defaultLevelName, cfg)
|
|
|
+ modeFilters := getFilters(sec.Key("filters").Strings(" "))
|
|
|
+
|
|
|
+ var handler log15.Handler
|
|
|
|
|
|
// Generate log configuration.
|
|
|
switch mode {
|
|
|
case "console":
|
|
|
- handlers = append(handlers, log15.LvlFilterHandler(level, log15.StdoutHandler))
|
|
|
+ handler = log15.StdoutHandler
|
|
|
case "file":
|
|
|
fileName := sec.Key("file_name").MustString(filepath.Join(logsPath, "grafana.log"))
|
|
|
os.MkdirAll(filepath.Dir(fileName), os.ModePerm)
|
|
|
@@ -134,7 +156,7 @@ func ReadLoggingConfig(modes []string, logsPath string, cfg *ini.File) {
|
|
|
fileHandler.Init()
|
|
|
|
|
|
loggersToClose = append(loggersToClose, fileHandler)
|
|
|
- handlers = append(handlers, log15.LvlFilterHandler(level, fileHandler))
|
|
|
+ handler = fileHandler
|
|
|
|
|
|
// case "conn":
|
|
|
// LogConfigs[i] = util.DynMap{
|
|
|
@@ -168,7 +190,41 @@ func ReadLoggingConfig(modes []string, logsPath string, cfg *ini.File) {
|
|
|
// "tag": sec.Key("tag").MustString(""),
|
|
|
// }
|
|
|
}
|
|
|
+
|
|
|
+ for key, value := range defaultFilters {
|
|
|
+ if _, exist := modeFilters[key]; !exist {
|
|
|
+ modeFilters[key] = value
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for key, value := range modeFilters {
|
|
|
+ fmt.Printf("key: %v, value: %v \n", key, value)
|
|
|
+ }
|
|
|
+
|
|
|
+ handler = LogFilterHandler(level, modeFilters, handler)
|
|
|
+ handlers = append(handlers, handler)
|
|
|
}
|
|
|
|
|
|
Root.SetHandler(log15.MultiHandler(handlers...))
|
|
|
}
|
|
|
+
|
|
|
+func LogFilterHandler(maxLevel log15.Lvl, filters map[string]log15.Lvl, h log15.Handler) log15.Handler {
|
|
|
+ return log15.FilterHandler(func(r *log15.Record) (pass bool) {
|
|
|
+
|
|
|
+ if len(filters) > 0 {
|
|
|
+ for i := 0; i < len(r.Ctx); i += 2 {
|
|
|
+ key := r.Ctx[i].(string)
|
|
|
+ if key == "logger" {
|
|
|
+ loggerName, strOk := r.Ctx[i+1].(string)
|
|
|
+ if strOk {
|
|
|
+ if filterLevel, ok := filters[loggerName]; ok {
|
|
|
+ return r.Lvl <= filterLevel
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return r.Lvl <= maxLevel
|
|
|
+ }, h)
|
|
|
+}
|