From 33f92d1a5fe7fb23ed94d3cff7cb85a3e26caf5d Mon Sep 17 00:00:00 2001 From: dwertent Date: Thu, 10 Mar 2022 11:19:05 +0200 Subject: [PATCH] update logger support --- cautils/logger/methods.go | 54 ++++++++++++++------------- cautils/logger/mocklogger/logger.go | 25 ------------- cautils/logger/nonelogger/logger.go | 28 ++++++++++++++ cautils/logger/prettylogger/logger.go | 8 ++-- cautils/logger/zaplogger/logger.go | 6 +-- cautils/scaninfo.go | 1 + clihandler/cmd/root.go | 27 +++++++++++--- 7 files changed, 86 insertions(+), 63 deletions(-) delete mode 100644 cautils/logger/mocklogger/logger.go create mode 100644 cautils/logger/nonelogger/logger.go diff --git a/cautils/logger/methods.go b/cautils/logger/methods.go index 7548fe78..885ac1ad 100644 --- a/cautils/logger/methods.go +++ b/cautils/logger/methods.go @@ -5,10 +5,9 @@ import ( "strings" "github.com/armosec/kubescape/cautils/logger/helpers" - "github.com/armosec/kubescape/cautils/logger/mocklogger" + "github.com/armosec/kubescape/cautils/logger/nonelogger" "github.com/armosec/kubescape/cautils/logger/prettylogger" "github.com/armosec/kubescape/cautils/logger/zaplogger" - "github.com/mattn/go-isatty" ) type ILogger interface { @@ -25,7 +24,7 @@ type ILogger interface { SetWriter(w *os.File) GetWriter() *os.File - DisableColor(flag bool) + LoggerName() string } var l ILogger @@ -33,45 +32,50 @@ var l ILogger // Return initialized logger. If logger not initialized, will call InitializeLogger() with the default value func L() ILogger { if l == nil { - InitializeLogger("") + InitDefaultLogger() } return l } -/* InitializeLogger initialize desired logger +/* InitLogger initialize desired logger Use: -InitializeLogger("") +InitLogger("") -Supported logger names +Supported logger names (call ListLoggersNames() for listing supported loggers) - "zap": Logger from package "go.uber.org/zap" - "pretty", "colorful": Human friendly colorful logger -- "mock", "empty", "ignore": Logger will be totally ignored - -e.g. -InitializeLogger("mock") -> will initialize the mock logger +- "none", "mock", "empty", "ignore": Logger will not print anything Default: -If isatty.IsTerminal(os.Stdout.Fd()): - "pretty" -else - "zap" +- "pretty" + +e.g. +InitLogger("none") -> will initialize the mock logger */ -func InitializeLogger(loggerName string) { +func InitLogger(loggerName string) { switch strings.ToLower(loggerName) { - case "zap": + case zaplogger.LoggerName: l = zaplogger.NewZapLogger() - case "pretty", "colorful": + case prettylogger.LoggerName, "colorful": l = prettylogger.NewPrettyLogger() - case "mock", "empty", "ignore": - l = mocklogger.NewMockLogger() + case nonelogger.LoggerName, "mock", "empty", "ignore": + l = nonelogger.NewNoneLogger() default: - if isatty.IsTerminal(os.Stdout.Fd()) { - l = prettylogger.NewPrettyLogger() - } else { - l = zaplogger.NewZapLogger() - } + InitDefaultLogger() } } + +func InitDefaultLogger() { + l = prettylogger.NewPrettyLogger() +} + +func DisableColor(flag bool) { + prettylogger.DisableColor(flag) +} + +func ListLoggersNames() []string { + return []string{prettylogger.LoggerName, zaplogger.LoggerName, nonelogger.LoggerName} +} diff --git a/cautils/logger/mocklogger/logger.go b/cautils/logger/mocklogger/logger.go deleted file mode 100644 index 452a5b54..00000000 --- a/cautils/logger/mocklogger/logger.go +++ /dev/null @@ -1,25 +0,0 @@ -package mocklogger - -import ( - "os" - - "github.com/armosec/kubescape/cautils/logger/helpers" -) - -type MockLogger struct { -} - -func NewMockLogger() *MockLogger { - return &MockLogger{} -} - -func (zl *MockLogger) GetLevel() string { return "" } -func (zl *MockLogger) SetWriter(w *os.File) {} -func (zl *MockLogger) GetWriter() *os.File { return nil } -func (zl *MockLogger) SetLevel(level string) error { return nil } -func (zl *MockLogger) Fatal(msg string, details ...helpers.IDetails) {} -func (zl *MockLogger) Error(msg string, details ...helpers.IDetails) {} -func (zl *MockLogger) Warning(msg string, details ...helpers.IDetails) {} -func (zl *MockLogger) Success(msg string, details ...helpers.IDetails) {} -func (zl *MockLogger) Info(msg string, details ...helpers.IDetails) {} -func (zl *MockLogger) Debug(msg string, details ...helpers.IDetails) {} diff --git a/cautils/logger/nonelogger/logger.go b/cautils/logger/nonelogger/logger.go new file mode 100644 index 00000000..39398558 --- /dev/null +++ b/cautils/logger/nonelogger/logger.go @@ -0,0 +1,28 @@ +package nonelogger + +import ( + "os" + + "github.com/armosec/kubescape/cautils/logger/helpers" +) + +const LoggerName string = "none" + +type NoneLogger struct { +} + +func NewNoneLogger() *NoneLogger { + return &NoneLogger{} +} + +func (nl *NoneLogger) GetLevel() string { return "" } +func (nl *NoneLogger) LoggerName() string { return LoggerName } +func (nl *NoneLogger) SetWriter(w *os.File) {} +func (nl *NoneLogger) GetWriter() *os.File { return nil } +func (nl *NoneLogger) SetLevel(level string) error { return nil } +func (nl *NoneLogger) Fatal(msg string, details ...helpers.IDetails) {} +func (nl *NoneLogger) Error(msg string, details ...helpers.IDetails) {} +func (nl *NoneLogger) Warning(msg string, details ...helpers.IDetails) {} +func (nl *NoneLogger) Success(msg string, details ...helpers.IDetails) {} +func (nl *NoneLogger) Info(msg string, details ...helpers.IDetails) {} +func (nl *NoneLogger) Debug(msg string, details ...helpers.IDetails) {} diff --git a/cautils/logger/prettylogger/logger.go b/cautils/logger/prettylogger/logger.go index 8abb8ed5..3899e5a7 100644 --- a/cautils/logger/prettylogger/logger.go +++ b/cautils/logger/prettylogger/logger.go @@ -8,6 +8,8 @@ import ( "github.com/armosec/kubescape/cautils/logger/helpers" ) +const LoggerName string = "pretty" + type PrettyLogger struct { writer *os.File level helpers.Level @@ -15,6 +17,7 @@ type PrettyLogger struct { } func NewPrettyLogger() *PrettyLogger { + return &PrettyLogger{ writer: os.Stderr, // default to stderr level: helpers.InfoLevel, @@ -25,10 +28,7 @@ func NewPrettyLogger() *PrettyLogger { func (pl *PrettyLogger) GetLevel() string { return pl.level.String() } func (pl *PrettyLogger) SetWriter(w *os.File) { pl.writer = w } func (pl *PrettyLogger) GetWriter() *os.File { return pl.writer } - -func (pl *PrettyLogger) DisableColor(flag bool) { - DisableColor(flag) -} +func (pl *PrettyLogger) LoggerName() string { return LoggerName } func (pl *PrettyLogger) SetLevel(level string) error { pl.level = helpers.ToLevel(level) diff --git a/cautils/logger/zaplogger/logger.go b/cautils/logger/zaplogger/logger.go index 0dc7869f..0043b058 100644 --- a/cautils/logger/zaplogger/logger.go +++ b/cautils/logger/zaplogger/logger.go @@ -8,6 +8,8 @@ import ( "go.uber.org/zap/zapcore" ) +const LoggerName string = "zap" + type ZapLogger struct { zapL *zap.Logger cfg zap.Config @@ -35,9 +37,7 @@ func NewZapLogger() *ZapLogger { func (zl *ZapLogger) GetLevel() string { return zl.cfg.Level.Level().String() } func (zl *ZapLogger) SetWriter(w *os.File) {} func (zl *ZapLogger) GetWriter() *os.File { return nil } - -func (zl *ZapLogger) DisableColor(flag bool) {} - +func (zl *ZapLogger) LoggerName() string { return LoggerName } func (zl *ZapLogger) SetLevel(level string) error { l := zapcore.Level(1) err := l.Set(level) diff --git a/cautils/scaninfo.go b/cautils/scaninfo.go index 75b691de..4c06bfc1 100644 --- a/cautils/scaninfo.go +++ b/cautils/scaninfo.go @@ -55,6 +55,7 @@ func (bpf *BoolPtrFlag) Set(val string) error { type RootInfo struct { Logger string // logger level + LoggerName string // logger name ("pretty"/"zap"/"none") CacheDir string // cached dir DisableColor bool // Disable Color } diff --git a/clihandler/cmd/root.go b/clihandler/cmd/root.go index 1ef491fd..c476202d 100644 --- a/clihandler/cmd/root.go +++ b/clihandler/cmd/root.go @@ -9,6 +9,7 @@ import ( "github.com/armosec/kubescape/cautils/getter" "github.com/armosec/kubescape/cautils/logger" "github.com/armosec/kubescape/cautils/logger/helpers" + "github.com/mattn/go-isatty" "github.com/spf13/cobra" ) @@ -54,6 +55,9 @@ func init() { rootCmd.PersistentFlags().MarkHidden("environment") rootCmd.PersistentFlags().MarkHidden("env") + rootCmd.PersistentFlags().StringVarP(&rootInfo.LoggerName, "logger-name", "l", "", fmt.Sprintf("Logger name. Supported: %s [$KS_LOGGER_NAME]", strings.Join(logger.ListLoggersNames(), "/"))) + rootCmd.PersistentFlags().MarkHidden("logger-name") + rootCmd.PersistentFlags().StringVarP(&rootInfo.Logger, "logger", "l", helpers.InfoLevel.String(), fmt.Sprintf("Logger level. Supported: %s [$KS_LOGGER]", strings.Join(helpers.SupportedLevels(), "/"))) rootCmd.PersistentFlags().StringVar(&rootInfo.CacheDir, "cache-dir", getter.DefaultLocalStore, "Cache directory [$KS_CACHE_DIR]") rootCmd.PersistentFlags().BoolVarP(&rootInfo.DisableColor, "disable-color", "", false, "Disable Color output for logging") @@ -61,9 +65,22 @@ func init() { } func initLogger() { - if l := os.Getenv("KS_LOGGER_NAME"); l != "" { - logger.InitializeLogger(l) + logger.DisableColor(rootInfo.DisableColor) + + if rootInfo.LoggerName == "" { + if l := os.Getenv("KS_LOGGER_NAME"); l != "" { + rootInfo.LoggerName = l + } else { + if isatty.IsTerminal(os.Stdout.Fd()) { + rootInfo.LoggerName = "pretty" + } else { + rootInfo.LoggerName = "zap" + } + } } + + logger.InitLogger(rootInfo.LoggerName) + } func initLoggerLevel() { if rootInfo.Logger != helpers.InfoLevel.String() { @@ -71,20 +88,18 @@ func initLoggerLevel() { rootInfo.Logger = l } - logger.L().DisableColor(rootInfo.DisableColor) - if err := logger.L().SetLevel(rootInfo.Logger); err != nil { logger.L().Fatal(fmt.Sprintf("supported levels: %s", strings.Join(helpers.SupportedLevels(), "/")), helpers.Error(err)) } } func initCacheDir() { - if rootInfo.CacheDir != getter.DefaultLocalStore { + if rootInfo.CacheDir == getter.DefaultLocalStore { getter.DefaultLocalStore = rootInfo.CacheDir } else if cacheDir := os.Getenv("KS_CACHE_DIR"); cacheDir != "" { getter.DefaultLocalStore = cacheDir } else { - return // using default cache di location + return // using default cache dir location } logger.L().Debug("cache dir updated", helpers.String("path", getter.DefaultLocalStore))