From fc6d9a372e6769471754bc56fa0dae5b8b94cd0b Mon Sep 17 00:00:00 2001 From: Dan Ballard Date: Thu, 18 Jun 2020 17:52:33 -0700 Subject: [PATCH] add color support: levels are now printed with a corresponding color --- .gitignore | 1 + log.go | 52 +++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..485dee6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea diff --git a/log.go b/log.go index d22e55f..a105f72 100644 --- a/log.go +++ b/log.go @@ -19,7 +19,38 @@ const ( LevelError ) +/**** Color code from https://gist.github.com/ik5/d8ecde700972d4378d87 ****/ +var ( + Debug = Teal + Info = Green + Warn = Yellow + Error = Red +) + +var ( + Black = Color("\033[1;30m%s\033[0m") + Red = Color("\033[1;31m%s\033[0m") + Green = Color("\033[1;32m%s\033[0m") + Yellow = Color("\033[1;33m%s\033[0m") + Purple = Color("\033[1;34m%s\033[0m") + Magenta = Color("\033[1;35m%s\033[0m") + Teal = Color("\033[1;36m%s\033[0m") + White = Color("\033[1;37m%s\033[0m") +) + +func Color(colorString string) func(...interface{}) string { + sprint := func(args ...interface{}) string { + return fmt.Sprintf(colorString, + fmt.Sprint(args...)) + } + return sprint +} + +/**** End color gist ****/ + var levelString = map[Level]string{LevelDebug: "[DBUG]", LevelInfo: "[INFO]", LevelWarn: "[WARN]", LevelError: "[ERR ]"} +var levelColor = map[Level]func(...interface{})string {LevelDebug: Debug, LevelInfo: Info, LevelWarn: Warn, LevelError: Error} + // Logger is a go Logger wrapper that adds log levels and pattern filtering // It allows high level 'log level' filtering broadly @@ -29,6 +60,7 @@ var levelString = map[Level]string{LevelDebug: "[DBUG]", LevelInfo: "[INFO]", Le type Logger struct { logger *golog.Logger level Level + useColor bool nothingExceptPatterns []string everythingFromPatterns []string excludeFromPatterns []string @@ -36,7 +68,7 @@ type Logger struct { // New returns a new Logger with a filter set to the supplied level func New(level Level) *Logger { - return &Logger{logger: golog.New(os.Stderr, "", golog.Ldate|golog.Ltime), level: level, everythingFromPatterns: make([]string, 0), nothingExceptPatterns: make([]string, 0)} + return &Logger{logger: golog.New(os.Stderr, "", golog.Ldate|golog.Ltime), level: level, useColor: true, everythingFromPatterns: make([]string, 0), nothingExceptPatterns: make([]string, 0)} } // NewFile returns a new Logger that logs to the supplied file with a filter set to the supplied level @@ -46,7 +78,7 @@ func NewFile(level Level, filename string) (*Logger, error) { return nil, err } - return &Logger{logger: golog.New(logfile, "", golog.Ldate|golog.Ltime), level: level, everythingFromPatterns: make([]string, 0), nothingExceptPatterns: make([]string, 0)}, nil + return &Logger{logger: golog.New(logfile, "", golog.Ldate|golog.Ltime), level: level, useColor: false, everythingFromPatterns: make([]string, 0), nothingExceptPatterns: make([]string, 0)}, nil } var std = New(LevelWarn) @@ -98,6 +130,11 @@ func (l *Logger) SetLevel(level Level) { l.level = level } +// SetUseColor toggles weather color output is used +func (l *Logger) SetUseColor(useColor bool) { + l.useColor = useColor +} + // AddNothingExceptFilter enables strong filtering showing logs only for things on the approved list, adding this pattern to the list func (l *Logger) AddNothingExceptFilter(pattern string) { l.nothingExceptPatterns = append(l.nothingExceptPatterns, pattern) @@ -131,7 +168,11 @@ func (l *Logger) header(level Level) string { } file = short } - return file + " " + levelString[level] + " " + if l.useColor { + return file + " " + levelColor[level](levelString[level]) + " " + } else { + return file + " " + levelString[level] + " " + } } // Printf outputs the format and variables, assuming it passes the filter levels @@ -153,6 +194,11 @@ func SetLevel(level Level) { std.SetLevel(level) } +// SetUseColor toggles weather color output is used +func SetUseColor(useColor bool) { + std.useColor = useColor +} + // AddNothingExceptFilter enables strong filtering showing logs only for things on the approved list, adding this pattern to the list func AddNothingExceptFilter(pattern string) { std.AddNothingExceptFilter(pattern)