From 968e1db94db6d832fbdb018873abd004d926a464 Mon Sep 17 00:00:00 2001 From: wanna Date: Mon, 28 Jun 2021 00:00:44 +0800 Subject: [PATCH] add log level prefix color --- os/glog/glog_logger.go | 8 ++++---- os/glog/glog_logger_chaining.go | 11 +++++++++++ os/glog/glog_logger_config.go | 5 +++++ os/glog/glog_logger_handler.go | 19 +++++++++++++++++-- os/glog/glog_logger_level.go | 25 +++++++++++++++++++++++++ 5 files changed, 62 insertions(+), 6 deletions(-) diff --git a/os/glog/glog_logger.go b/os/glog/glog_logger.go index 7f4dcbc91..7a50d6b2c 100644 --- a/os/glog/glog_logger.go +++ b/os/glog/glog_logger.go @@ -43,6 +43,7 @@ const ( defaultFilePerm = os.FileMode(0666) defaultFileExpire = time.Minute pathFilterKey = "/os/glog/glog" + bufferStdOut = "stdOut" ) const ( @@ -220,20 +221,19 @@ func (l *Logger) print(ctx context.Context, level int, values ...interface{}) { // printToWriter writes buffer to writer. func (l *Logger) printToWriter(ctx context.Context, input *HandlerInput) { - buffer := input.Buffer() if l.config.Writer == nil { // Output content to disk file. if l.config.Path != "" { - l.printToFile(input.Time, buffer) + l.printToFile(input.Time, input.Buffer()) } // Allow output to stdout? if l.config.StdoutPrint { - if _, err := os.Stdout.Write(buffer.Bytes()); err != nil { + if _, err := os.Stdout.Write(input.Buffer(bufferStdOut).Bytes()); err != nil { intlog.Error(err) } } } else { - if _, err := l.config.Writer.Write(buffer.Bytes()); err != nil { + if _, err := l.config.Writer.Write(input.Buffer().Bytes()); err != nil { // panic(err) intlog.Error(err) } diff --git a/os/glog/glog_logger_chaining.go b/os/glog/glog_logger_chaining.go index 3a5080b62..e96c55ec7 100644 --- a/os/glog/glog_logger_chaining.go +++ b/os/glog/glog_logger_chaining.go @@ -245,3 +245,14 @@ func (l *Logger) Async(enabled ...bool) *Logger { } return logger } + +func (l *Logger) Color(color logColor) *Logger { + logger := (*Logger)(nil) + if l.parent == nil { + logger = l.Clone() + } else { + logger = l + } + logger.SetColor(color) + return logger +} \ No newline at end of file diff --git a/os/glog/glog_logger_config.go b/os/glog/glog_logger_config.go index 6b00a6afd..00c974705 100644 --- a/os/glog/glog_logger_config.go +++ b/os/glog/glog_logger_config.go @@ -42,6 +42,7 @@ type Config struct { RotateBackupExpire time.Duration `json:"rotateBackupExpire"` // Max expire for rotated files, which is 0 in default, means no expiration. RotateBackupCompress int `json:"rotateBackupCompress"` // Compress level for rotated files using gzip algorithm. It's 0 in default, means no compression. RotateCheckInterval time.Duration `json:"rotateCheckInterval"` // Asynchronizely checks the backups and expiration at intervals. It's 1 hour in default. + color logColor `json:"-"` } // DefaultConfig returns the default configuration for logger. @@ -252,3 +253,7 @@ func (l *Logger) SetPrefix(prefix string) { func (l *Logger) SetHandlers(handlers ...Handler) { l.config.Handlers = append(handlers, defaultHandler) } + +func (l *Logger) SetColor(color logColor) { + l.config.color = color +} diff --git a/os/glog/glog_logger_handler.go b/os/glog/glog_logger_handler.go index 69a703992..37c318643 100644 --- a/os/glog/glog_logger_handler.go +++ b/os/glog/glog_logger_handler.go @@ -9,6 +9,7 @@ package glog import ( "bytes" "context" + "fmt" "time" ) @@ -42,11 +43,15 @@ func (i *HandlerInput) addStringToBuffer(buffer *bytes.Buffer, s string) { buffer.WriteString(s) } -func (i *HandlerInput) Buffer() *bytes.Buffer { +func (i *HandlerInput) Buffer(bufferType ...string) *bytes.Buffer { buffer := bytes.NewBuffer(nil) buffer.WriteString(i.TimeFormat) if i.LevelFormat != "" { - i.addStringToBuffer(buffer, i.LevelFormat) + if len(bufferType) > 0 && bufferType[0] == bufferStdOut { + i.addStringToBuffer(buffer, i.getLevelFormatWithColor()) + } else { + i.addStringToBuffer(buffer, i.LevelFormat) + } } if i.CallerFunc != "" { i.addStringToBuffer(buffer, i.CallerFunc) @@ -67,6 +72,16 @@ func (i *HandlerInput) Buffer() *bytes.Buffer { return buffer } +// getLevelFormatWithColor returns the prefix string with color. +func (i *HandlerInput) getLevelFormatWithColor() string { + s := i.LevelFormat + color := defaultLevelColor[i.Level] + if i.logger.config.color != 0 { + color = i.logger.config.color + } + return fmt.Sprintf("\x1b[0;%dm%s\x1b[0m", color, s) +} + func (i *HandlerInput) String() string { return i.Buffer().String() } diff --git a/os/glog/glog_logger_level.go b/os/glog/glog_logger_level.go index a756bc6f8..49a4c1f94 100644 --- a/os/glog/glog_logger_level.go +++ b/os/glog/glog_logger_level.go @@ -29,6 +29,19 @@ const ( LEVEL_FATA // 1024 ) +type logColor int + +const ( + COLOR_BLACK logColor = 30 + iota + COLOR_RED + COLOR_GREEN + COLOR_YELLOW + COLOR_BLUE + COLOR_MAGENTA + COLOR_CYAN + COLOR_WHITE +) + // defaultLevelPrefixes defines the default level and its mapping prefix string. var defaultLevelPrefixes = map[int]string{ LEVEL_DEBU: "DEBU", @@ -41,6 +54,18 @@ var defaultLevelPrefixes = map[int]string{ LEVEL_FATA: "FATA", } +// defaultLevelColor defines the default level and its mapping prefix string. +var defaultLevelColor = map[int]logColor{ + LEVEL_DEBU: COLOR_YELLOW, + LEVEL_INFO: COLOR_GREEN, + LEVEL_NOTI: COLOR_CYAN, + LEVEL_WARN: COLOR_YELLOW, + LEVEL_ERRO: COLOR_RED, + LEVEL_CRIT: COLOR_RED, + LEVEL_PANI: COLOR_RED, + LEVEL_FATA: COLOR_RED, +} + // levelStringMap defines level string name to its level mapping. var levelStringMap = map[string]int{ "ALL": LEVEL_DEBU | LEVEL_INFO | LEVEL_NOTI | LEVEL_WARN | LEVEL_ERRO | LEVEL_CRIT,