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 loggerMap map[string]*Logger = map[string]*Logger{}
|
||||||
var appenderFactoryMap map[string]func(LogAppenderConfig) *LoggerAppender = map[string]func(LogAppenderConfig) *LoggerAppender{}
|
var appenderFactoryMap map[string]func(LogAppenderConfig) *LoggerAppender = map[string]func(LogAppenderConfig) *LoggerAppender{}
|
||||||
var appenders map[string]*LoggerAppender = map[string]*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 LogAppenderConfig struct {
|
||||||
Type string `json:"type"`
|
Type string `json:"type"`
|
||||||
|
@ -107,13 +121,11 @@ func GetLogger(name string) *Logger {
|
||||||
if ok {
|
if ok {
|
||||||
return makeLogger(name, logConfig)
|
return makeLogger(name, logConfig)
|
||||||
}
|
}
|
||||||
if name == "default" {
|
logConfig, ok = loggerConfig.Categories["default"]
|
||||||
return defaultLogger
|
l := makeLogger(name, logConfig)
|
||||||
}
|
|
||||||
l := *GetLogger("default")
|
|
||||||
l.category = name
|
l.category = name
|
||||||
loggerMap[name] = &l
|
loggerMap[name] = l
|
||||||
return &l
|
return l
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,9 +145,15 @@ func makeLogger(name string, config LogConfig) *Logger {
|
||||||
loggerMap[name] = logger
|
loggerMap[name] = logger
|
||||||
return logger
|
return logger
|
||||||
}
|
}
|
||||||
func Configure(config LoggersConfig) {
|
|
||||||
|
func ReconfigLoggers(config LoggersConfig) {
|
||||||
|
validateConfig(config)
|
||||||
loggerConfig = config
|
loggerConfig = config
|
||||||
for name, appenderConfig := range loggerConfig.Appenders {
|
for name, appenderConfig := range loggerConfig.Appenders {
|
||||||
|
oldappender, ok := appenders[name]
|
||||||
|
if ok {
|
||||||
|
(*oldappender).Close()
|
||||||
|
}
|
||||||
appenderFactory, ok := appenderFactoryMap[appenderConfig.Type]
|
appenderFactory, ok := appenderFactoryMap[appenderConfig.Type]
|
||||||
if ok {
|
if ok {
|
||||||
appenders[name] = appenderFactory(appenderConfig)
|
appenders[name] = appenderFactory(appenderConfig)
|
||||||
|
@ -143,12 +161,38 @@ func Configure(config LoggersConfig) {
|
||||||
appenders[name] = &consoleAppender
|
appenders[name] = &consoleAppender
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for name, _ := range loggerConfig.Categories {
|
for name, logger := range loggerMap {
|
||||||
GetLogger(name)
|
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) {
|
func RegistAppender(typeName string, appenderCreatCb func(LogAppenderConfig) *LoggerAppender) {
|
||||||
|
|
||||||
appenderFactoryMap[typeName] = appenderCreatCb
|
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) {
|
func TestGetLogger(t *testing.T) {
|
||||||
// Initialize loggerMap and loggerConfig
|
// Initialize loggerMap and loggerConfig
|
||||||
|
|
||||||
|
dl := GetLogger("default")
|
||||||
|
if dl != defaultLogger {
|
||||||
|
t.Errorf("GetLogger(\"defult\") should return defaultLogger")
|
||||||
|
}
|
||||||
|
dl.Error("test")
|
||||||
Configure(LoggersConfig{
|
Configure(LoggersConfig{
|
||||||
Appenders: map[string]LogAppenderConfig{
|
Appenders: map[string]LogAppenderConfig{
|
||||||
"console": {
|
"console": {
|
||||||
|
@ -24,12 +30,10 @@ func TestGetLogger(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
dl := GetLogger("default")
|
dl.Info("test")
|
||||||
// if dl != defaultLogger {
|
if dl.level != Info {
|
||||||
// t.Errorf("GetLogger(\"defult\") should return defaultLogger")
|
t.Errorf("GetLogger(\"default\") should return defaultLogger")
|
||||||
// }
|
}
|
||||||
dl.Error("test")
|
|
||||||
|
|
||||||
al := GetLogger("app")
|
al := GetLogger("app")
|
||||||
|
|
||||||
if al == dl {
|
if al == dl {
|
||||||
|
|
Loading…
Reference in New Issue