From 2b39ff78374f3b99c4c874b7cf71b1f50e058e7e Mon Sep 17 00:00:00 2001 From: IamCathal Date: Fri, 28 Aug 2020 18:00:45 +0100 Subject: [PATCH] New opts formatter working for console --- pkg/logs/conn.go | 32 ++++++++++++++++---------------- pkg/logs/console.go | 31 +++++++++++++++++++------------ pkg/logs/file.go | 16 +++++++++------- pkg/logs/jianliao.go | 18 ++++++++++-------- pkg/logs/log.go | 36 ++++++++++++++++++++++++++---------- pkg/logs/multifile.go | 22 ++++++++++++---------- pkg/logs/slack.go | 17 +++++++++-------- pkg/logs/smtp.go | 18 ++++++++++-------- 8 files changed, 111 insertions(+), 79 deletions(-) diff --git a/pkg/logs/conn.go b/pkg/logs/conn.go index e11909a0..55cbecdd 100644 --- a/pkg/logs/conn.go +++ b/pkg/logs/conn.go @@ -18,20 +18,20 @@ import ( "encoding/json" "io" "net" + + "github.com/astaxie/beego/pkg/common" ) // connWriter implements LoggerInterface. // Writes messages in keep-live tcp connection. type connWriter struct { - lg *logWriter - innerWriter io.WriteCloser - UseCustomFormatter bool - CustomFormatter func(*LogMsg) string - ReconnectOnMsg bool `json:"reconnectOnMsg"` - Reconnect bool `json:"reconnect"` - Net string `json:"net"` - Addr string `json:"addr"` - Level int `json:"level"` + lg *logWriter + innerWriter io.WriteCloser + ReconnectOnMsg bool `json:"reconnectOnMsg"` + Reconnect bool `json:"reconnect"` + Net string `json:"net"` + Addr string `json:"addr"` + Level int `json:"level"` } // NewConn creates new ConnWrite returning as LoggerInterface. @@ -47,13 +47,13 @@ func (c *connWriter) Format(lm *LogMsg) string { // Init initializes a connection writer with json config. // json config only needs they "level" key -func (c *connWriter) Init(jsonConfig string, LogFormatter ...func(*LogMsg) string) error { - for _, elem := range LogFormatter { - if elem != nil { - c.UseCustomFormatter = true - c.CustomFormatter = elem - } - } +func (c *connWriter) Init(jsonConfig string, opts ...common.SimpleKV) error { + // for _, elem := range LogFormatter { + // if elem != nil { + // c.UseCustomFormatter = true + // c.CustomFormatter = elem + // } + // } return json.Unmarshal([]byte(jsonConfig), c) } diff --git a/pkg/logs/console.go b/pkg/logs/console.go index a928de7d..55958008 100644 --- a/pkg/logs/console.go +++ b/pkg/logs/console.go @@ -19,6 +19,8 @@ import ( "os" "strings" + "github.com/astaxie/beego/pkg/common" + "github.com/shiena/ansicolor" ) @@ -47,11 +49,10 @@ var colors = []brush{ // consoleWriter implements LoggerInterface and writes messages to terminal. type consoleWriter struct { - lg *logWriter - UseCustomFormatter bool - CustomFormatter func(*LogMsg) string - Level int `json:"level"` - Colorful bool `json:"color"` //this filed is useful only when system's terminal supports color + lg *logWriter + customFormatter func(*LogMsg) string + Level int `json:"level"` + Colorful bool `json:"color"` //this filed is useful only when system's terminal supports color } func (c *consoleWriter) Format(lm *LogMsg) string { @@ -80,11 +81,16 @@ func NewConsole() Logger { // Init initianlizes the console logger. // jsonConfig must be in the format '{"level":LevelTrace}' -func (c *consoleWriter) Init(jsonConfig string, LogFormatter ...func(*LogMsg) string) error { - for _, elem := range LogFormatter { - if elem != nil { - c.UseCustomFormatter = true - c.CustomFormatter = elem +// func (c *consoleWriter) Init(jsonConfig string, LogFormatter ...func(*LogMsg) string) error { +func (c *consoleWriter) Init(jsonConfig string, opts ...common.SimpleKV) error { + + for _, elem := range opts { + if elem.Key == "formatter" { + formatter, err := GetFormatter(elem) + if err != nil { + return err + } + c.customFormatter = formatter } } @@ -107,10 +113,11 @@ func (c *consoleWriter) WriteMsg(lm *LogMsg) error { msg := "" - if c.UseCustomFormatter { - msg = c.CustomFormatter(lm) + if c.customFormatter != nil { + msg = c.customFormatter(lm) } else { msg = c.Format(lm) + } c.lg.writeln(msg) diff --git a/pkg/logs/file.go b/pkg/logs/file.go index 4576e19d..0324486e 100644 --- a/pkg/logs/file.go +++ b/pkg/logs/file.go @@ -27,6 +27,8 @@ import ( "strings" "sync" "time" + + "github.com/astaxie/beego/pkg/common" ) // fileLogWriter implements LoggerInterface. @@ -107,13 +109,13 @@ func (w *fileLogWriter) Format(lm *LogMsg) string { // "rotate":true, // "perm":"0600" // } -func (w *fileLogWriter) Init(jsonConfig string, LogFormatter ...func(*LogMsg) string) error { - for _, elem := range LogFormatter { - if elem != nil { - w.UseCustomFormatter = true - w.CustomFormatter = elem - } - } +func (w *fileLogWriter) Init(jsonConfig string, opts ...common.SimpleKV) error { + // for _, elem := range LogFormatter { + // if elem != nil { + // w.UseCustomFormatter = true + // w.CustomFormatter = elem + // } + // } err := json.Unmarshal([]byte(jsonConfig), w) if err != nil { diff --git a/pkg/logs/jianliao.go b/pkg/logs/jianliao.go index 9877bed6..8daa8015 100644 --- a/pkg/logs/jianliao.go +++ b/pkg/logs/jianliao.go @@ -5,6 +5,8 @@ import ( "fmt" "net/http" "net/url" + + "github.com/astaxie/beego/pkg/common" ) // JLWriter implements beego LoggerInterface and is used to send jiaoliao webhook @@ -25,15 +27,15 @@ func newJLWriter() Logger { } // Init JLWriter with json config string -func (s *JLWriter) Init(jsonconfig string, LogFormatter ...func(*LogMsg) string) error { - for _, elem := range LogFormatter { - if elem != nil { - s.UseCustomFormatter = true - s.CustomFormatter = elem - } - } +func (s *JLWriter) Init(jsonConfig string, opts ...common.SimpleKV) error { + // for _, elem := range LogFormatter { + // if elem != nil { + // s.UseCustomFormatter = true + // s.CustomFormatter = elem + // } + // } - return json.Unmarshal([]byte(jsonconfig), s) + return json.Unmarshal([]byte(jsonConfig), s) } func (s *JLWriter) Format(lm *LogMsg) string { diff --git a/pkg/logs/log.go b/pkg/logs/log.go index fd8fca63..9529c865 100644 --- a/pkg/logs/log.go +++ b/pkg/logs/log.go @@ -38,10 +38,13 @@ import ( "log" "os" "path" + "reflect" "runtime" "strings" "sync" "time" + + "github.com/astaxie/beego/pkg/common" ) // RFC5424 log message levels. @@ -84,7 +87,7 @@ type newLoggerFunc func() Logger // Logger defines the behavior of a log provider. type Logger interface { - Init(config string, LogFormatter ...func(*LogMsg) string) error + Init(config string, opts ...common.SimpleKV) error WriteMsg(lm *LogMsg) error Format(lm *LogMsg) string Destroy() @@ -210,7 +213,7 @@ func (bl *BeeLogger) setLogger(adapterName string, configs ...string) error { // Global formatter overrides the default set formatter // but not adapter specific formatters set with logs.SetLoggerWithOpts() if bl.globalFormatter != nil { - err = lg.Init(config, bl.globalFormatter) + err = lg.Init(config) } else { err = lg.Init(config) } @@ -401,9 +404,21 @@ func (bl *BeeLogger) startLogger() { } } +// Get the formatter from the opts common.SimpleKV structure +// Looks for a key: "formatter" with value: func(*LogMsg) string +func GetFormatter(opts common.SimpleKV) (func(*LogMsg) string, error) { + if strings.ToLower(opts.Key.(string)) == "formatter" { + formatterInterface := reflect.ValueOf(opts.Value).Interface() + formatterFunc := formatterInterface.(func(*LogMsg) string) + return formatterFunc, nil + } + + return nil, fmt.Errorf("no \"formatter\" key given in simpleKV") +} + // SetLoggerWithOpts sets a log adapter with a user defined logging format. Config must be valid JSON // such as: {"interval":360} -func (bl *BeeLogger) setLoggerWithOpts(adapterName string, formatterFunc func(*LogMsg) string, configs ...string) error { +func (bl *BeeLogger) setLoggerWithOpts(adapterName string, opts common.SimpleKV, configs ...string) error { config := append(configs, "{}")[0] for _, l := range bl.outputs { if l.name == adapterName { @@ -416,12 +431,12 @@ func (bl *BeeLogger) setLoggerWithOpts(adapterName string, formatterFunc func(*L return fmt.Errorf("logs: unknown adaptername %q (forgotten Register?)", adapterName) } - if formatterFunc == nil { - return fmt.Errorf("No formatter set for %s log adapter", adapterName) + if opts.Key == nil { + return fmt.Errorf("No SimpleKV struct set for %s log adapter", adapterName) } lg := logAdapter() - err := lg.Init(config, formatterFunc) + err := lg.Init(config, opts) if err != nil { fmt.Fprintln(os.Stderr, "logs.BeeLogger.SetLogger: "+err.Error()) return err @@ -436,21 +451,22 @@ func (bl *BeeLogger) setLoggerWithOpts(adapterName string, formatterFunc func(*L } // SetLogger provides a given logger adapter into BeeLogger with config string. -func (bl *BeeLogger) SetLoggerWithOpts(adapterName string, formatterFunc func(*LogMsg) string, configs ...string) error { +func (bl *BeeLogger) SetLoggerWithOpts(adapterName string, opts common.SimpleKV, configs ...string) error { bl.lock.Lock() defer bl.lock.Unlock() if !bl.init { bl.outputs = []*nameLogger{} bl.init = true } - return bl.setLoggerWithOpts(adapterName, formatterFunc, configs...) + return bl.setLoggerWithOpts(adapterName, opts, configs...) } // SetLoggerWIthOpts sets a given log adapter with a custom log adapter. // Log Adapter must be given in the form common.SimpleKV{Key: "formatter": Value: struct.FormatFunc} // where FormatFunc has the signature func(*LogMsg) string -func SetLoggerWithOpts(adapter string, config []string, formatterFunc func(*LogMsg) string) error { - err := beeLogger.SetLoggerWithOpts(adapter, formatterFunc, config...) +// func SetLoggerWithOpts(adapter string, config []string, formatterFunc func(*LogMsg) string) error { +func SetLoggerWithOpts(adapter string, config []string, opts common.SimpleKV) error { + err := beeLogger.SetLoggerWithOpts(adapter, opts, config...) if err != nil { log.Fatal(err) } diff --git a/pkg/logs/multifile.go b/pkg/logs/multifile.go index bcd4dd4e..720f5125 100644 --- a/pkg/logs/multifile.go +++ b/pkg/logs/multifile.go @@ -16,6 +16,8 @@ package logs import ( "encoding/json" + + "github.com/astaxie/beego/pkg/common" ) // A filesLogWriter manages several fileLogWriter @@ -46,16 +48,16 @@ var levelNames = [...]string{"emergency", "alert", "critical", "error", "warning // "separate":["emergency", "alert", "critical", "error", "warning", "notice", "info", "debug"], // } -func (f *multiFileLogWriter) Init(config string, LogFormatter ...func(*LogMsg) string) error { - for _, elem := range LogFormatter { - if elem != nil { - f.UseCustomFormatter = true - f.CustomFormatter = elem - } - } +func (f *multiFileLogWriter) Init(jsonConfig string, opts ...common.SimpleKV) error { + // for _, elem := range LogFormatter { + // if elem != nil { + // f.UseCustomFormatter = true + // f.CustomFormatter = elem + // } + // } writer := newFileWriter().(*fileLogWriter) - err := writer.Init(config) + err := writer.Init(jsonConfig) if err != nil { return err } @@ -63,10 +65,10 @@ func (f *multiFileLogWriter) Init(config string, LogFormatter ...func(*LogMsg) s f.writers[LevelDebug+1] = writer //unmarshal "separate" field to f.Separate - json.Unmarshal([]byte(config), f) + json.Unmarshal([]byte(jsonConfig), f) jsonMap := map[string]interface{}{} - json.Unmarshal([]byte(config), &jsonMap) + json.Unmarshal([]byte(jsonConfig), &jsonMap) for i := LevelEmergency; i < LevelDebug+1; i++ { for _, v := range f.Separate { diff --git a/pkg/logs/slack.go b/pkg/logs/slack.go index 9407b48a..0fc75149 100644 --- a/pkg/logs/slack.go +++ b/pkg/logs/slack.go @@ -5,6 +5,8 @@ import ( "fmt" "net/http" "net/url" + + "github.com/astaxie/beego/pkg/common" ) // SLACKWriter implements beego LoggerInterface and is used to send jiaoliao webhook @@ -25,15 +27,14 @@ func (s *SLACKWriter) Format(lm *LogMsg) string { } // Init SLACKWriter with json config string -func (s *SLACKWriter) Init(jsonconfig string, LogFormatter ...func(*LogMsg) string) error { - for _, elem := range LogFormatter { - if elem != nil { - s.UseCustomFormatter = true - s.CustomFormatter = elem - } - } +func (s *SLACKWriter) Init(jsonConfig string, opts ...common.SimpleKV) error { + // if elem != nil { + // s.UseCustomFormatter = true + // s.CustomFormatter = elem + // } + // } - return json.Unmarshal([]byte(jsonconfig), s) + return json.Unmarshal([]byte(jsonConfig), s) } // WriteMsg write message in smtp writer. diff --git a/pkg/logs/smtp.go b/pkg/logs/smtp.go index b81be68f..17148812 100644 --- a/pkg/logs/smtp.go +++ b/pkg/logs/smtp.go @@ -21,6 +21,8 @@ import ( "net" "net/smtp" "strings" + + "github.com/astaxie/beego/pkg/common" ) // SMTPWriter implements LoggerInterface and is used to send emails via given SMTP-server. @@ -52,15 +54,15 @@ func newSMTPWriter() Logger { // "sendTos":["email1","email2"], // "level":LevelError // } -func (s *SMTPWriter) Init(jsonconfig string, LogFormatter ...func(*LogMsg) string) error { - for _, elem := range LogFormatter { - if elem != nil { - s.UseCustomFormatter = true - s.CustomFormatter = elem - } - } +func (s *SMTPWriter) Init(jsonConfig string, opts ...common.SimpleKV) error { + // for _, elem := range LogFormatter { + // if elem != nil { + // s.UseCustomFormatter = true + // s.CustomFormatter = elem + // } + // } - return json.Unmarshal([]byte(jsonconfig), s) + return json.Unmarshal([]byte(jsonConfig), s) } func (s *SMTPWriter) getSMTPAuth(host string) smtp.Auth {