[VOL-2356]core log_level command line argument should take log level names not int value
- StringToInt method returns an error message when invalid loglevel is passed.
Change-Id: If567c0a6800da91a77e8be205de8c01b4f22271b
diff --git a/VERSION b/VERSION
index a909317..d5401ed 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-3.0.10
+3.0.11-dev
diff --git a/pkg/log/log.go b/pkg/log/log.go
index 43567e3..6b07693 100644
--- a/pkg/log/log.go
+++ b/pkg/log/log.go
@@ -50,9 +50,11 @@
"strings"
)
+type LogLevel int8
+
const (
// DebugLevel logs a message at debug level
- DebugLevel = iota
+ DebugLevel = LogLevel(iota)
// InfoLevel logs a message at info level
InfoLevel
// WarnLevel logs a message at warning level
@@ -109,7 +111,7 @@
V(l int) bool
//Returns the log level of this specific logger
- GetLogLevel() int
+ GetLogLevel() LogLevel
}
// Fields is used as key-value pairs for structured logging
@@ -127,7 +129,7 @@
packageName string
}
-func intToAtomicLevel(l int) zp.AtomicLevel {
+func logLevelToAtomicLevel(l LogLevel) zp.AtomicLevel {
switch l {
case DebugLevel:
return zp.NewAtomicLevelAt(zc.DebugLevel)
@@ -143,7 +145,7 @@
return zp.NewAtomicLevelAt(zc.ErrorLevel)
}
-func intToLevel(l int) zc.Level {
+func logLevelToLevel(l LogLevel) zc.Level {
switch l {
case DebugLevel:
return zc.DebugLevel
@@ -159,7 +161,7 @@
return zc.ErrorLevel
}
-func levelToInt(l zc.Level) int {
+func levelToLogLevel(l zc.Level) LogLevel {
switch l {
case zc.DebugLevel:
return DebugLevel
@@ -175,25 +177,25 @@
return ErrorLevel
}
-func StringToInt(l string) int {
- switch l {
+func StringToLogLevel(l string) (LogLevel, error) {
+ switch strings.ToUpper(l) {
case "DEBUG":
- return DebugLevel
+ return DebugLevel, nil
case "INFO":
- return InfoLevel
+ return InfoLevel, nil
case "WARN":
- return WarnLevel
+ return WarnLevel, nil
case "ERROR":
- return ErrorLevel
+ return ErrorLevel, nil
case "FATAL":
- return FatalLevel
+ return FatalLevel, nil
}
- return ErrorLevel
+ return 0, errors.New("Given LogLevel is invalid : " + l)
}
-func getDefaultConfig(outputType string, level int, defaultFields Fields) zp.Config {
+func getDefaultConfig(outputType string, level LogLevel, defaultFields Fields) zp.Config {
return zp.Config{
- Level: intToAtomicLevel(level),
+ Level: logLevelToAtomicLevel(level),
Encoding: outputType,
Development: true,
OutputPaths: []string{"stdout"},
@@ -215,7 +217,7 @@
// SetLogger needs to be invoked before the logger API can be invoked. This function
// initialize the default logger (zap's sugaredlogger)
-func SetDefaultLogger(outputType string, level int, defaultFields Fields) (Logger, error) {
+func SetDefaultLogger(outputType string, level LogLevel, defaultFields Fields) (Logger, error) {
// Build a custom config using zap
cfg = getDefaultConfig(outputType, level, defaultFields)
@@ -241,7 +243,7 @@
// be available to it, notably log tracing with filename.functionname.linenumber annotation.
//
// pkgNames parameter should be used for testing only as this function detects the caller's package.
-func AddPackage(outputType string, level int, defaultFields Fields, pkgNames ...string) (Logger, error) {
+func AddPackage(outputType string, level LogLevel, defaultFields Fields, pkgNames ...string) (Logger, error) {
if cfgs == nil {
cfgs = make(map[string]zp.Config)
}
@@ -347,7 +349,7 @@
return loggers[pkgName], nil
}
-func setLevel(cfg zp.Config, level int) {
+func setLevel(cfg zp.Config, level LogLevel) {
switch level {
case DebugLevel:
cfg.Level.SetLevel(zc.DebugLevel)
@@ -366,7 +368,7 @@
//SetPackageLogLevel dynamically sets the log level of a given package to level. This is typically invoked at an
// application level during debugging
-func SetPackageLogLevel(packageName string, level int) {
+func SetPackageLogLevel(packageName string, level LogLevel) {
// Get proper config
if cfg, ok := cfgs[packageName]; ok {
setLevel(cfg, level)
@@ -374,7 +376,7 @@
}
//SetAllLogLevel sets the log level of all registered packages to level
-func SetAllLogLevel(level int) {
+func SetAllLogLevel(level LogLevel) {
// Get proper config
for _, cfg := range cfgs {
setLevel(cfg, level)
@@ -382,7 +384,7 @@
}
//GetPackageLogLevel returns the current log level of a package.
-func GetPackageLogLevel(packageName ...string) (int, error) {
+func GetPackageLogLevel(packageName ...string) (LogLevel, error) {
var name string
if len(packageName) == 1 {
name = packageName[0]
@@ -390,18 +392,18 @@
name, _, _, _ = getCallerInfo()
}
if cfg, ok := cfgs[name]; ok {
- return levelToInt(cfg.Level.Level()), nil
+ return levelToLogLevel(cfg.Level.Level()), nil
}
return 0, errors.New(fmt.Sprintf("unknown-package-%s", name))
}
//GetDefaultLogLevel gets the log level used for packages that don't have specific loggers
-func GetDefaultLogLevel() int {
- return levelToInt(cfg.Level.Level())
+func GetDefaultLogLevel() LogLevel {
+ return levelToLogLevel(cfg.Level.Level())
}
//SetLogLevel sets the log level for the logger corresponding to the caller's package
-func SetLogLevel(level int) error {
+func SetLogLevel(level LogLevel) error {
pkgName, _, _, _ := getCallerInfo()
if _, exist := cfgs[pkgName]; !exist {
return errors.New(fmt.Sprintf("unregistered-package-%s", pkgName))
@@ -412,7 +414,7 @@
}
//SetDefaultLogLevel sets the log level used for packages that don't have specific loggers
-func SetDefaultLogLevel(level int) {
+func SetDefaultLogLevel(level LogLevel) {
setLevel(cfg, level)
}
@@ -642,12 +644,12 @@
// V reports whether verbosity level l is at least the requested verbose level.
func (l logger) V(level int) bool {
- return l.parent.Core().Enabled(intToLevel(level))
+ return l.parent.Core().Enabled(logLevelToLevel(LogLevel(level)))
}
// GetLogLevel returns the current level of the logger
-func (l logger) GetLogLevel() int {
- return levelToInt(cfgs[l.packageName].Level.Level())
+func (l logger) GetLogLevel() LogLevel {
+ return levelToLogLevel(cfgs[l.packageName].Level.Level())
}
// With returns a logger initialized with the key-value pairs
@@ -781,6 +783,6 @@
}
//GetLogLevel returns the log level of the invoking package
-func GetLogLevel() int {
+func GetLogLevel() LogLevel {
return getPackageLevelLogger().GetLogLevel()
}
diff --git a/pkg/log/log_test.go b/pkg/log/log_test.go
index f32c55e..84a91d1 100644
--- a/pkg/log/log_test.go
+++ b/pkg/log/log_test.go
@@ -35,7 +35,7 @@
}
func verifyLogLevel(t *testing.T, minimumLevel int) {
- SetAllLogLevel(minimumLevel)
+ SetAllLogLevel(LogLevel(minimumLevel))
var success bool
for i := 0; i < 5; i++ {
success = testLogger.V(i)
@@ -87,14 +87,14 @@
levels := []int{0, 1, 2, 3, 4}
for _, expectedLevel := range levels {
for _, name := range pkgNames {
- SetPackageLogLevel(name, expectedLevel)
+ SetPackageLogLevel(name, LogLevel(expectedLevel))
l, err := GetPackageLogLevel(name)
assert.Nil(t, err)
- assert.Equal(t, l, expectedLevel)
+ assert.Equal(t, l, LogLevel(expectedLevel))
// Get the package log level by invoking the specific logger created for this package
// This is a less expensive operation that the GetPackageLogLevel() request
level := myLoggers[name].GetLogLevel()
- assert.Equal(t, level, expectedLevel)
+ assert.Equal(t, level, LogLevel(expectedLevel))
// Check the verbosity level
for _, level := range levels {
toDisplay := myLoggers[name].V(level)
@@ -108,13 +108,13 @@
}
//Test set all package level
for _, expectedLevel := range levels {
- SetAllLogLevel(expectedLevel)
+ SetAllLogLevel(LogLevel(expectedLevel))
for _, name := range pkgNames {
l, err := GetPackageLogLevel(name)
assert.Nil(t, err)
- assert.Equal(t, l, expectedLevel)
+ assert.Equal(t, l, LogLevel(expectedLevel))
level := myLoggers[name].GetLogLevel()
- assert.Equal(t, level, expectedLevel)
+ assert.Equal(t, level, LogLevel(expectedLevel))
// Check the verbosity level
for _, level := range levels {
toDisplay := myLoggers[name].V(level)