From 6e8ef8d0b03314d9b5b2d99296c4a3d4f9301dfc Mon Sep 17 00:00:00 2001 From: John Date: Mon, 23 Mar 2020 22:36:06 +0800 Subject: [PATCH] add level string feature for package glog --- os/glog/glog_logger_config.go | 22 +++--------- os/glog/glog_logger_level.go | 54 ++++++++++++++++++++++++++++-- os/glog/glog_z_unit_config_test.go | 36 ++++++++++++++++++++ 3 files changed, 93 insertions(+), 19 deletions(-) diff --git a/os/glog/glog_logger_config.go b/os/glog/glog_logger_config.go index 7b8ee2d56..e88f19b99 100644 --- a/os/glog/glog_logger_config.go +++ b/os/glog/glog_logger_config.go @@ -8,6 +8,7 @@ package glog import ( "errors" + "fmt" "github.com/gogf/gf/internal/intlog" "github.com/gogf/gf/os/gfile" "github.com/gogf/gf/util/gconv" @@ -81,13 +82,10 @@ func (l *Logger) SetConfigWithMap(m map[string]interface{}) error { // Change string configuration to int value for level. levelKey, levelValue := gutil.MapPossibleItemByKey(m, "level") if levelValue != nil { - switch gconv.String(levelValue) { - case "all": - m[levelKey] = LEVEL_ALL - case "dev": - m[levelKey] = LEVEL_DEV - case "prod": - m[levelKey] = LEVEL_PROD + if level, ok := levelStringMap[strings.ToUpper(gconv.String(levelValue))]; ok { + m[levelKey] = level + } else { + return errors.New(fmt.Sprintf(`invalid level string: %v`, levelValue)) } } config := DefaultConfig() @@ -98,16 +96,6 @@ func (l *Logger) SetConfigWithMap(m map[string]interface{}) error { return l.SetConfig(config) } -// SetLevel sets the logging level. -func (l *Logger) SetLevel(level int) { - l.config.Level = level -} - -// GetLevel returns the logging level value. -func (l *Logger) GetLevel() int { - return l.config.Level -} - // SetDebug enables/disables the debug level for logger. // The debug level is enabled in default. func (l *Logger) SetDebug(debug bool) { diff --git a/os/glog/glog_logger_level.go b/os/glog/glog_logger_level.go index 48560ac40..05dc93ae7 100644 --- a/os/glog/glog_logger_level.go +++ b/os/glog/glog_logger_level.go @@ -6,12 +6,22 @@ package glog +import ( + "errors" + "fmt" + "strings" +) + // Note that the LEVEL_PANI and LEVEL_FATA levels are not used for logging output, // but for prefix configurations. const ( - LEVEL_ALL = LEVEL_DEBU | LEVEL_INFO | LEVEL_NOTI | LEVEL_WARN | LEVEL_ERRO | LEVEL_CRIT - LEVEL_DEV = LEVEL_ALL + // Deprecated. + LEVEL_ALL = LEVEL_DEBU | LEVEL_INFO | LEVEL_NOTI | LEVEL_WARN | LEVEL_ERRO | LEVEL_CRIT + // Deprecated. + LEVEL_DEV = LEVEL_ALL + // Deprecated. LEVEL_PROD = LEVEL_WARN | LEVEL_ERRO | LEVEL_CRIT + LEVEL_DEBU = 1 << iota // 8 LEVEL_INFO // 16 LEVEL_NOTI // 32 @@ -34,6 +44,46 @@ var defaultLevelPrefixes = map[int]string{ LEVEL_FATA: "FATA", } +// levelStringMap defines level string name to its level mapping. +var levelStringMap = map[string]int{ + "ALL": LEVEL_DEBU | LEVEL_INFO | LEVEL_NOTI | LEVEL_WARN | LEVEL_ERRO | LEVEL_CRIT, + "DEV": LEVEL_DEBU | LEVEL_INFO | LEVEL_NOTI | LEVEL_WARN | LEVEL_ERRO | LEVEL_CRIT, + "DEVELOP": LEVEL_DEBU | LEVEL_INFO | LEVEL_NOTI | LEVEL_WARN | LEVEL_ERRO | LEVEL_CRIT, + "PROD": LEVEL_WARN | LEVEL_ERRO | LEVEL_CRIT, + "PRODUCT": LEVEL_WARN | LEVEL_ERRO | LEVEL_CRIT, + "DEBU": LEVEL_DEBU | LEVEL_INFO | LEVEL_NOTI | LEVEL_WARN | LEVEL_ERRO | LEVEL_CRIT, + "DEBUG": LEVEL_DEBU | LEVEL_INFO | LEVEL_NOTI | LEVEL_WARN | LEVEL_ERRO | LEVEL_CRIT, + "INFO": LEVEL_INFO | LEVEL_NOTI | LEVEL_WARN | LEVEL_ERRO | LEVEL_CRIT, + "NOTI": LEVEL_NOTI | LEVEL_WARN | LEVEL_ERRO | LEVEL_CRIT, + "NOTICE": LEVEL_NOTI | LEVEL_WARN | LEVEL_ERRO | LEVEL_CRIT, + "WARN": LEVEL_WARN | LEVEL_ERRO | LEVEL_CRIT, + "WARNING": LEVEL_WARN | LEVEL_ERRO | LEVEL_CRIT, + "ERRO": LEVEL_ERRO | LEVEL_CRIT, + "ERROR": LEVEL_ERRO | LEVEL_CRIT, + "CRIT": LEVEL_CRIT, + "CRITICAL": LEVEL_CRIT, +} + +// SetLevel sets the logging level. +func (l *Logger) SetLevel(level int) { + l.config.Level = level +} + +// GetLevel returns the logging level value. +func (l *Logger) GetLevel() int { + return l.config.Level +} + +// SetLevelStr sets the logging level by level string. +func (l *Logger) SetLevelStr(levelStr string) error { + if level, ok := levelStringMap[strings.ToUpper(levelStr)]; ok { + l.config.Level = level + } else { + return errors.New(fmt.Sprintf(`invalid level string: %s`, levelStr)) + } + return nil +} + // SetLevelPrefix sets the prefix string for specified level. func (l *Logger) SetLevelPrefix(level int, prefix string) { l.config.LevelPrefixes[level] = prefix diff --git a/os/glog/glog_z_unit_config_test.go b/os/glog/glog_z_unit_config_test.go index d23d1d59c..6279b4d54 100644 --- a/os/glog/glog_z_unit_config_test.go +++ b/os/glog/glog_z_unit_config_test.go @@ -7,7 +7,9 @@ package glog import ( + "bytes" "github.com/gogf/gf/test/gtest" + "strings" "testing" ) @@ -27,3 +29,37 @@ func Test_SetConfigWithMap(t *testing.T) { t.Assert(l.config.StdoutPrint, m["stdout"]) }) } + +func Test_SetConfigWithMap_LevelStr(t *testing.T) { + gtest.C(t, func(t *gtest.T) { + buffer := bytes.NewBuffer(nil) + l := New() + m := map[string]interface{}{ + "level": "all", + } + err := l.SetConfigWithMap(m) + t.Assert(err, nil) + + l.SetWriter(buffer) + + l.Debug("test") + l.Warning("test") + t.Assert(strings.Contains(buffer.String(), "DEBU"), true) + t.Assert(strings.Contains(buffer.String(), "WARN"), true) + }) + + gtest.C(t, func(t *gtest.T) { + buffer := bytes.NewBuffer(nil) + l := New() + m := map[string]interface{}{ + "level": "warn", + } + err := l.SetConfigWithMap(m) + t.Assert(err, nil) + l.SetWriter(buffer) + l.Debug("test") + l.Warning("test") + t.Assert(strings.Contains(buffer.String(), "DEBU"), false) + t.Assert(strings.Contains(buffer.String(), "WARN"), true) + }) +}