diff --git a/main.go b/main.go index 00e9d28..ee194f2 100644 --- a/main.go +++ b/main.go @@ -25,7 +25,21 @@ var logLevelMap map[string]int = map[string]int{ var loggerMap map[string]*Logger = map[string]*Logger{} var appenderFactoryMap map[string]func(LogAppenderConfig) *LoggerAppender = map[string]func(LogAppenderConfig) *LoggerAppender{} var appenders map[string]*LoggerAppender = map[string]*LoggerAppender{} -var loggerConfig LoggersConfig +var loggerConfig LoggersConfig = LoggersConfig{ + Appenders: map[string]LogAppenderConfig{ + "console": { + Type: "console", + Formatter: "text", + Options: map[string]interface{}{}, + }, + }, + Categories: map[string]LogConfig{ + "default": { + Level: "error", + Appenders: []string{"console"}, + }, + }, +} type LogAppenderConfig struct { Type string `json:"type"` @@ -107,13 +121,11 @@ func GetLogger(name string) *Logger { if ok { return makeLogger(name, logConfig) } - if name == "default" { - return defaultLogger - } - l := *GetLogger("default") + logConfig, ok = loggerConfig.Categories["default"] + l := makeLogger(name, logConfig) l.category = name - loggerMap[name] = &l - return &l + loggerMap[name] = l + return l } } @@ -133,9 +145,15 @@ func makeLogger(name string, config LogConfig) *Logger { loggerMap[name] = logger return logger } -func Configure(config LoggersConfig) { + +func ReconfigLoggers(config LoggersConfig) { + validateConfig(config) loggerConfig = config for name, appenderConfig := range loggerConfig.Appenders { + oldappender, ok := appenders[name] + if ok { + (*oldappender).Close() + } appenderFactory, ok := appenderFactoryMap[appenderConfig.Type] if ok { appenders[name] = appenderFactory(appenderConfig) @@ -143,12 +161,38 @@ func Configure(config LoggersConfig) { appenders[name] = &consoleAppender } } - for name, _ := range loggerConfig.Categories { - GetLogger(name) + for name, logger := range loggerMap { + logConfig, ok := loggerConfig.Categories[name] + if !ok { + logConfig, _ = loggerConfig.Categories["default"] + } + logger.level = logLevelMap[strings.ToLower(logConfig.Level)] + if len(logConfig.Appenders) == 0 { + logger.appenders = []*LoggerAppender{&consoleAppender} + } else { + logger.appenders = make([]*LoggerAppender, len(logConfig.Appenders)) + for i, appenderName := range logConfig.Appenders { + logger.appenders[i] = appenders[appenderName] + } + } } } +func validateConfig(config LoggersConfig) { + _, ok := loggerConfig.Categories["default"] + if !ok { + panic("default logger config not found") + } +} +func Configure(config LoggersConfig) { + validateConfig(config) + ReconfigLoggers(config) +} func RegistAppender(typeName string, appenderCreatCb func(LogAppenderConfig) *LoggerAppender) { appenderFactoryMap[typeName] = appenderCreatCb } + +func init() { + loggerMap["default"] = defaultLogger +} diff --git a/main_test.go b/main_test.go index 60a9b3c..b4a0c2d 100644 --- a/main_test.go +++ b/main_test.go @@ -5,6 +5,12 @@ import "testing" func TestGetLogger(t *testing.T) { // Initialize loggerMap and loggerConfig + + dl := GetLogger("default") + if dl != defaultLogger { + t.Errorf("GetLogger(\"defult\") should return defaultLogger") + } + dl.Error("test") Configure(LoggersConfig{ Appenders: map[string]LogAppenderConfig{ "console": { @@ -24,12 +30,10 @@ func TestGetLogger(t *testing.T) { }, }, }) - dl := GetLogger("default") - // if dl != defaultLogger { - // t.Errorf("GetLogger(\"defult\") should return defaultLogger") - // } - dl.Error("test") - + dl.Info("test") + if dl.level != Info { + t.Errorf("GetLogger(\"default\") should return defaultLogger") + } al := GetLogger("app") if al == dl {