make it can reconfig
This commit is contained in:
parent
b5ea719c56
commit
42beab28a3
64
main.go
64
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
|
||||
}
|
||||
|
|
16
main_test.go
16
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 {
|
||||
|
|
Loading…
Reference in New Issue