This package is a fork of the original lmittmann/tint package. This fork adds support for color expressions (in MemoANSI format) in log messages.
Package tint
implements a zero-dependency slog.Handler
that writes tinted (colorized) logs. Its output format is inspired by the zerolog.ConsoleWriter
and
slog.TextHandler
.
The output format can be customized using Options
which is a drop-in replacement for slog.HandlerOptions
.
go get github.com/phplego/tint
w := os.Stderr
// create a new logger
logger := slog.New(tint.NewHandler(w, nil))
// set global logger with custom options
slog.SetDefault(slog.New(
tint.NewHandler(w, &tint.Options{
Level: slog.LevelDebug,
TimeFormat: time.Kitchen,
}),
))
ReplaceAttr
can be used to alter or drop attributes. If set, it is called on
each non-group attribute before it is logged. See slog.HandlerOptions
for details.
// create a new logger that doesn't write the time
w := os.Stderr
logger := slog.New(
tint.NewHandler(w, &tint.Options{
ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {
if a.Key == slog.TimeKey && len(groups) == 0 {
return slog.Attr{}
}
return a
},
}),
)
// create a new logger that writes all errors in red
w := os.Stderr
logger := slog.New(
tint.NewHandler(w, &tint.Options{
ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {
if err, ok := a.Value.Any().(error); ok {
aErr := tint.Err(err)
aErr.Key = a.Key
return aErr
}
return a
},
}),
)
Color expression is a string that starts with @
followed by a color/background/boldness code and ends with {some text}
.
The format is @<color><bold><background>{text}
for example @r!W{red bold on white background}
.
First symbol after @
is a color code, second symbol is an optional boldness flag (exclamation mark) and third symbol is an optional background color code.
// usage of color expressions
slog.Info("Example of @r{red color}")
slog.Info("Example of @R{bright red color}")
slog.Info("Example of @r!{red bold color}")
slog.Info("Example of @rW{red on white backgound}")
slog.Info("Example of @r!W{red bold on white backgound}")
slog.Info("Example of @*{Rainbow text}")
Supported color codes are:
Code | Color | Bright Variant Code | Bright Color |
---|---|---|---|
k | Black | K | Bright Black (Gray) |
r | Red | R | Bright Red |
g | Green | G | Bright Green |
y | Yellow | Y | Bright Yellow |
b | Blue | B | Bright Blue |
m | Magenta | M | Bright Magenta |
c | Cyan | C | Bright Cyan |
w | White | W | Bright White |
*
- Rainbow. Special color where each character has a different color.
See MemoANSI format for more details.
Colors are enabled by default and can be disabled using the Options.NoColor
attribute. To automatically enable colors based on the terminal capabilities,
use e.g. the go-isatty
package.
w := os.Stderr
logger := slog.New(
tint.NewHandler(w, &tint.Options{
NoColor: !isatty.IsTerminal(w.Fd()),
}),
)
Color support on Windows can be added by using e.g. the
go-colorable
package.
w := os.Stderr
logger := slog.New(
tint.NewHandler(colorable.NewColorable(w), nil),
)