From 248ff19dbd0645564d664b35c30205fd5b1f4246 Mon Sep 17 00:00:00 2001 From: Noah Petherbridge Date: Sat, 10 Jun 2017 17:01:22 -0700 Subject: [PATCH] Initial commit --- LICENSE | 21 ++++++++++ README.md | 71 ++++++++++++++++++++++++++++++++++ ansi/colors.go | 23 +++++++++++ colors.go | 34 +++++++++++++++++ config.go | 72 ++++++++++++++++++++++++++++++++++ formatter.go | 102 +++++++++++++++++++++++++++++++++++++++++++++++++ golog.go | 43 +++++++++++++++++++++ golog_test.go | 54 ++++++++++++++++++++++++++ levels.go | 70 +++++++++++++++++++++++++++++++++ screenshot.png | Bin 0 -> 66621 bytes themes.go | 37 ++++++++++++++++++ 11 files changed, 527 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 ansi/colors.go create mode 100644 colors.go create mode 100644 config.go create mode 100644 formatter.go create mode 100644 golog.go create mode 100644 golog_test.go create mode 100644 levels.go create mode 100644 screenshot.png create mode 100644 themes.go diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..cabbc44 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017 Noah Petherbridge + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..fefbc3f --- /dev/null +++ b/README.md @@ -0,0 +1,71 @@ +# Go Log + +This is Yet Another Logger for Go programs. + +![Screenshot](https://raw.githubusercontent.com/kirsle/golog/master/screenshot.png) + +This is a logging package designed for local interactive shells running text +based Go programs. To that end, this prints colorful log lines with customizable +themes. + +The color options for the log lines are `NoColor` (default), `ANSIColor` +which limits the color codes to the standard 16 ANSI colors, and +`ExtendedColor` which supports the 256-color palette of `xterm` and other +modern terminal emulators. The theming engine supports defining colors using +hex codes, supported by [tomnomnom/xtermcolor](https://github.com/tomnomnom/xtermcolor). + +This module is still a work in progress and will be extended and improved as I +use it for other personal Go projects. + +# Usage + +```go +package main + +import "github.com/kirsle/golog" + +var log golog.Logger + +func init() { + // Get a named logger and configure it. Note: you can call GetLogger any + // number of times from any place in your codebase. It implements the + // singleton pattern. + log = golog.GetLogger("main") + log.Configure(&golog.Config{ + Colors: golog.ExtendedColor, + Theme: golog.DarkTheme, + }) +} + +func main() { + // The log functions work like `fmt.Printf` + log.Debug("Running on %s", runtime.GOOS) + log.Info("Hello, world!") +} +``` + +# License + +``` +The MIT License (MIT) + +Copyright (c) 2017 Noah Petherbridge + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` diff --git a/ansi/colors.go b/ansi/colors.go new file mode 100644 index 0000000..f0c5b8c --- /dev/null +++ b/ansi/colors.go @@ -0,0 +1,23 @@ +package ansi + +// Names and escape codes for the standard ANSI colors. +const ( + Black = `30` + BrightBlack = `30;1` + Red = `31` + BrightRed = `31;1` + Green = `32` + BrightGreen = `32;1` + Yellow = `33` + BrightYellow = `33;1` + Blue = `34` + BrightBlue = `34;1` + Magenta = `35` + BrightMagenta = `35;1` + Cyan = `36` + BrightCyan = `36;1` + White = `37` + BrightWhite = `37;1` + + Reset = `0` +) diff --git a/colors.go b/colors.go new file mode 100644 index 0000000..3a22524 --- /dev/null +++ b/colors.go @@ -0,0 +1,34 @@ +package golog + +import ( + "fmt" + + "github.com/tomnomnom/xtermcolor" +) + +type colorLevel int + +// Options for color support in your logger. +const ( + // NoColor doesn't use any color codes at all (plain text). + NoColor colorLevel = iota + + // ANSIColor uses the standard 16 colors supported by most terminals. This + // option is the most portable across platforms. + ANSIColor + + // ExtendedColor allows the use of 256 colors supported by most modern + // terminals (24-bit color codes). + ExtendedColor +) + +// HexColor is a convenient wrapper around `xtermcolor.FromHexStr` to define colors +// for themes for xterm-256color codes. +func HexColor(hex string) string { + code, err := xtermcolor.FromHexStr(hex) + if err != nil { + code = 201 // bright magenta seems like a good default + } + + return fmt.Sprintf("38;5;%d", code) +} diff --git a/config.go b/config.go new file mode 100644 index 0000000..20e80fb --- /dev/null +++ b/config.go @@ -0,0 +1,72 @@ +package golog + +import "io" + +// Config stores settings that control the logger's behavior. +type Config struct { + // Level is one of DebugLevel, InfoLevel, WarnLevel, ErrorLevel or FatalLevel. + // Messages emitted by the logger must be 'at least' this level to be logged. + Level logLevel + + // What colors are supported? Default is NoColor. Use ANSIColor to support + // legacy terminal emulators, or ExtendedColor for modern 256-color support. + Colors colorLevel + + // Which color theme are you using? The default is DarkTheme. + Theme Theme + + // Where to write the log messages to? If not defined with a custom io.Writer, + // the default goes to standard output for Debug and Info messages and + // standard error for warnings, errors, and fatal messages. + Writer *io.Writer + + // How do you want to format your log lines? This should be a Go text format + // string, with the following variable placeholders: + // + // {{.Time}} inserts the date/time stamp for the log message. + // {{.Level}} inserts a label for the log level, e.g. "INFO" or "WARN" + // {{.Message}} inserts the text of the log message itself. + // {{.Primary}} inserts the color sequence for the primary color based + // on the log level for the message. + // {{.Secondary}} inserts the color sequence for the secondary color. + // {{.Reset}} inserts the 'reset' color sequence to stop coloring + // the rest of the text that follows. + // + // The default log format is as follows: + // + // {{.Secondary}}{{.Time}}{{.Reset}} {{.Primary}}[{{.Level}}]{{.Reset}} {{.Message}} + Format string + + // How do you want to format your time stamps? (The `{{.Time}}`). This uses + // the Go `time` module, so the TimeFormat should use their reference date/time. + // The default TimeFormat is: `2006-01-02 15:04:05` + TimeFormat string +} + +// DefaultConfig returns a Config with the default values filled in. +func DefaultConfig() *Config { + return &Config{ + Theme: DarkTheme, + Format: DefaultFormat, + TimeFormat: DefaultTime, + } +} + +// Configure applies the configuration to the logger. If any of the following +// keys are not defined (or have zero-values), the default value for the key will +// be used instead: +// +// Format +// TimeFormat +func (l *Logger) Configure(cfg *Config) { + // Important keys and their defaults. + if cfg.Format == "" { + cfg.Format = DefaultFormat + } + if cfg.TimeFormat == "" { + cfg.TimeFormat = DefaultTime + } + + l.Config = cfg + l.template = nil +} diff --git a/formatter.go b/formatter.go new file mode 100644 index 0000000..a355d7d --- /dev/null +++ b/formatter.go @@ -0,0 +1,102 @@ +package golog + +import ( + "bytes" + "fmt" + "text/template" + "time" + + "github.com/kirsle/golog/ansi" +) + +// Convenient log formats to use in your logger. +const ( + // DefaultFormat: shows the date in the secondary (dark) color, the label + // in the bright color, and the message text in the normal color. + DefaultFormat = `{{.Secondary}}{{.Time}}{{.Reset}} {{.Primary}}[{{.Level}}]{{.Reset}} {{.Message}}` + + // ColorfulFormat: like the DefaultFormat, but the message itself is also + // colored using the secondary color. + ColorfulFormat = `{{.Secondary}}{{.Time}}{{.Reset}} {{.Primary}}[{{.Level}}]{{.Reset}} {{.Secondary}}{{.Message}}{{.Reset}}` +) + +// Convenient time formats to use in your logger. +const ( + // DefaultTime is the default, in `yyyy-mm-dd hh:mm:ss` format. + DefaultTime = `2006-01-02 15:04:05` + + // FriendlyTime is a human readable `Jan 2 15:04:05 2006` format. + FriendlyTime = `Jan 2 15:04:05 2006` +) + +// formatter provides the variables that can be used in the log format. +type formatter struct { + Time string + Level string + Message string + Primary string + Secondary string + Reset string +} + +// Format and return a log message. +func (l *Logger) Format(level logLevel, tmpl string, args ...interface{}) string { + // Prepare the variables to apply to the log message format. + format := formatter{ + Time: time.Now().Format(l.Config.TimeFormat), + Level: levelNames[level], + Message: fmt.Sprintf(tmpl, args...), + } + + // Find the theme color to use. + if l.Config.Colors != NoColor { + var ( + primary ThemeColor + secondary ThemeColor + ) + + switch level { + case DebugLevel: + primary = l.Config.Theme.Debug + secondary = l.Config.Theme.DebugSecondary + case InfoLevel: + primary = l.Config.Theme.Info + secondary = l.Config.Theme.InfoSecondary + case WarnLevel: + primary = l.Config.Theme.Warn + secondary = l.Config.Theme.WarnSecondary + case ErrorLevel: + primary = l.Config.Theme.Error + secondary = l.Config.Theme.ErrorSecondary + } + + // What color level are we supporting? + if l.Config.Colors == ANSIColor { + format.Primary = fmt.Sprintf("\x1B[%sm", primary.ANSI) + format.Secondary = fmt.Sprintf("\x1B[%sm", secondary.ANSI) + format.Reset = fmt.Sprintf("\x1B[%sm", ansi.Reset) + } else if l.Config.Colors == ExtendedColor { + format.Primary = fmt.Sprintf("\x1B[%sm", primary.Extended) + format.Secondary = fmt.Sprintf("\x1B[%sm", secondary.Extended) + format.Reset = fmt.Sprintf("\x1B[%sm", ansi.Reset) + } + } + + // Do we have the template cached? + if l.template == nil { + template, err := template.New("golog").Parse(l.Config.Format) + if err != nil { + return fmt.Sprintf("[GoLog format error: %s]", err) + } + l.template = template + } + + // Evaluate the template. + var buf bytes.Buffer + err := l.template.Execute(&buf, format) + if err != nil { + return fmt.Sprintf("[GoLog template error: %s]", err) + } + + return buf.String() +} diff --git a/golog.go b/golog.go new file mode 100644 index 0000000..64836b9 --- /dev/null +++ b/golog.go @@ -0,0 +1,43 @@ +package golog + +import ( + "sync" + "text/template" +) + +// An internal map of named loggers. This allows for GetLogger() to be called +// many times from anywhere in your code base, but for only one logger instance +// to be created for it. +var ( + loggers map[string]*Logger + loggerMutex sync.Mutex +) + +func init() { + loggers = map[string]*Logger{} +} + +// Logger stores the configuration for a named logger instance. +type Logger struct { + Name string + Config *Config + + // Private cached text/template, the first time the formatter is used. + template *template.Template +} + +// GetLogger initializes and returns a new Logger. +func GetLogger(name string) *Logger { + loggerMutex.Lock() + defer loggerMutex.Unlock() + + // Initialize the logger the first time we ask for it. + if _, ok := loggers[name]; !ok { + loggers[name] = &Logger{ + Name: name, + Config: DefaultConfig(), + } + } + + return loggers[name] +} diff --git a/golog_test.go b/golog_test.go new file mode 100644 index 0000000..239f7a4 --- /dev/null +++ b/golog_test.go @@ -0,0 +1,54 @@ +package golog + +import "testing" + +func TestColors(t *testing.T) { + log := GetLogger("test") + + // Helper function to emit all the log types. + emitLogs := func(message string) { + log.Debug(message) + log.Info(message) + log.Warn(message) + log.Error(message) + } + + log.Configure(&Config{ + Theme: DarkTheme, + Colors: ANSIColor, + }) + emitLogs("With standard 16-color ANSI codes.") + + log.Configure(&Config{ + Theme: DarkTheme, + Colors: ExtendedColor, + }) + emitLogs("With xterm-256color codes.") + + log.Configure(&Config{ + Theme: DarkTheme, + Colors: ExtendedColor, + Format: ColorfulFormat, + }) + emitLogs("Colorful format.") +} + +func TestLogLevels(t *testing.T) { + log := GetLogger("levels") + + // Helper function to emit all the log types. + emitLogs := func(message string) { + log.Debug(message) + log.Info(message) + log.Warn(message) + log.Error(message) + } + + emitLogs("Default log level=debug") + log.Config.Level = InfoLevel + emitLogs("With Level=Info") + log.Config.Level = WarnLevel + emitLogs("With Level=Warn") + log.Config.Level = ErrorLevel + emitLogs("With Level=Error") +} diff --git a/levels.go b/levels.go new file mode 100644 index 0000000..725d258 --- /dev/null +++ b/levels.go @@ -0,0 +1,70 @@ +package golog + +import ( + "fmt" + "os" +) + +type logLevel int + +// Log levels for controlling whether or not logs of certain types will be +// emitted by your logger. +const ( + DebugLevel logLevel = iota + InfoLevel + WarnLevel + ErrorLevel +) + +// Map log levels to human readable labels. +var levelNames = map[logLevel]string{ + DebugLevel: "DEBUG", + InfoLevel: "INFO", + WarnLevel: "WARN", + ErrorLevel: "ERROR", +} + +// emit is the general purpose log line emitter. +func (l *Logger) emit(level logLevel, tmpl string, args ...interface{}) { + message := l.Format(level, tmpl, args...) + + // If we have a log writer, send it there. + if l.Config.Writer != nil { + // l.Config.Writer.Write(message) + } else { + // No writer given so we default to standard out/error. + if level <= InfoLevel { + fmt.Fprintln(os.Stdout, message) + } else { + fmt.Fprintln(os.Stderr, message) + } + } +} + +// Debug emits a debug-level message from the logger. +func (l *Logger) Debug(tmpl string, args ...interface{}) { + if l.Config.Level <= DebugLevel { + l.emit(DebugLevel, tmpl, args...) + } +} + +// Info emits an informational message. +func (l *Logger) Info(tmpl string, args ...interface{}) { + if l.Config.Level <= InfoLevel { + l.emit(InfoLevel, tmpl, args...) + } +} + +// Warn emits a warning message. +func (l *Logger) Warn(tmpl string, args ...interface{}) { + if l.Config.Level <= WarnLevel { + l.emit(WarnLevel, tmpl, args...) + } +} + +// Error emits an error message. +func (l *Logger) Error(tmpl string, args ...interface{}) { + if l.Config.Level <= ErrorLevel { + l.emit(ErrorLevel, tmpl, args...) + } +} diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..643376ac69761df4d571cb0d14b7759af9cf1f11 GIT binary patch literal 66621 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 literal 0 HcmV?d00001 diff --git a/themes.go b/themes.go new file mode 100644 index 0000000..f161d6e --- /dev/null +++ b/themes.go @@ -0,0 +1,37 @@ +package golog + +import "github.com/kirsle/golog/ansi" + +// Theme defines the color scheme for a logger. Each log level has two colors: +// a primary (for the label itself) and a secondary color. For example, if your +// log lines include a date/time this could be colored using the secondary +// color. +type Theme struct { + Debug ThemeColor + DebugSecondary ThemeColor + Info ThemeColor + InfoSecondary ThemeColor + Warn ThemeColor + WarnSecondary ThemeColor + Error ThemeColor + ErrorSecondary ThemeColor +} + +// ThemeColor defines a color tuple for ANSI (legacy) support and modern +// 256-color support. +type ThemeColor struct { + ANSI string + Extended string +} + +// DarkTheme is a suitable default theme for dark terminal backgrounds. +var DarkTheme = Theme{ + Debug: ThemeColor{ansi.BrightCyan, HexColor("#FF99FF")}, + DebugSecondary: ThemeColor{ansi.Cyan, HexColor("#996699")}, + Info: ThemeColor{ansi.BrightGreen, HexColor("#0099FF")}, + InfoSecondary: ThemeColor{ansi.Green, HexColor("#006699")}, + Warn: ThemeColor{ansi.BrightYellow, HexColor("#FF9900")}, + WarnSecondary: ThemeColor{ansi.Yellow, HexColor("#996600")}, + Error: ThemeColor{ansi.BrightRed, HexColor("#FF0000")}, + ErrorSecondary: ThemeColor{ansi.Red, HexColor("#CC0000")}, +}