topi314 / tint

🌈 slog.Handler that writes tinted (colorized) logs

Home Page:https://pkg.go.dev/github.com/lmittmann/tint

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

tint: 🌈 slog.Handler that writes tinted logs

Go Reference Go Report Card



Note

This is a fork of https://github.com/lmittmann/tint with custom colors

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/topi314/tint

Usage

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,
    }),
))

Customize Colors

Colors can be customized using the Options.LevelColors and Options.Colors attributes. See tint.Options for details.

// ANSI escape codes: https://en.wikipedia.org/wiki/ANSI_escape_code
const (
    ansiFaint            = "\033[2m"
    ansiBrightRed        = "\033[91m"
    ansiBrightRedFaint   = "\033[91;2m"
    ansiBrightGreen      = "\033[92m"
    ansiBrightYellow     = "\033[93m"
    ansiBrightYellowBold = "\033[93;1m"
    ansiBrightBlueBold   = "\033[94;1m"
    ansiBrightMagenta    = "\033[95m"
)

// create a new logger with custom colors
w := os.Stderr
logger := slog.New(
    tint.NewHandler(w, &tint.Options{
        LevelColors: map[slog.Level]string{
            slog.LevelDebug: ansiBrightMagenta,
            slog.LevelInfo:  ansiBrightGreen,
            slog.LevelWarn:  ansiBrightYellow,
            slog.LevelError: ansiBrightRed,
        },
		Colors: map[tint.Kind]string{
            tint.KindTime:            ansiBrightYellowBold,
            tint.KindSourceFile:      ansiFaint,
            tint.KindSourceSeparator: ansiFaint,
            tint.KindSourceLine:      ansiFaint,
            tint.KindMessage:         ansiBrightBlueBold,
            tint.KindKey:             ansiFaint,
            tint.KindSeparator:       ansiFaint,
            tint.KindValue:           ansiBrightBlueBold,
            tint.KindErrorKey:        ansiBrightRedFaint,
            tint.KindErrorSeparator:  ansiBrightRedFaint,
            tint.KindErrorValue:      ansiBrightRed,
		},
    }),
)

Customize Attributes

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
        },
    }),
)

Automatically Enable Colors

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()),
    }),
)

Windows Support

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),
)

About

🌈 slog.Handler that writes tinted (colorized) logs

https://pkg.go.dev/github.com/lmittmann/tint

License:MIT License


Languages

Language:Go 100.0%