package log
import (
"context"
"fmt"
"log/slog"
"time"
)
var (
colorReset = "\033[0m"
colorFaded = "\033[2m"
colorRed = "\033[31m"
colorGreen = "\033[32m"
colorYellow = "\033[33m"
colorCyan = "\033[36m"
)
type PrettyHandler struct {
handler slog .Handler
}
func NewPrettyHandler (h slog .Handler ) *PrettyHandler {
return &PrettyHandler {handler : h }
}
func (h *PrettyHandler ) Handle (ctx context .Context , r slog .Record ) error {
timestamp := getFadedTimestamp (r .Time )
levelColor := getColorForLevel (r .Level )
level := fmt .Sprintf ("%s%-5s%s" , levelColor , r .Level .String (), colorReset )
var msg string
msg += fmt .Sprintf ("%s %s %s" , timestamp , level , r .Message )
r .Attrs (func (attr slog .Attr ) bool {
msg += fmt .Sprintf (" %s=%v" , attr .Key , attr .Value )
return true
})
fmt .Println (msg )
return nil
}
func (h *PrettyHandler ) WithAttrs (attrs []slog .Attr ) slog .Handler {
return &PrettyHandler {handler : h .handler .WithAttrs (attrs )}
}
func (h *PrettyHandler ) WithGroup (name string ) slog .Handler {
return &PrettyHandler {handler : h .handler .WithGroup (name )}
}
func getFadedTimestamp(t time .Time ) string {
return fmt .Sprintf ("%s%s%s" , colorFaded , t .Format (time .RFC3339 ), colorReset )
}
func getColorForLevel(level slog .Level ) string {
switch {
case level == slog .LevelError :
return colorRed
case level == slog .LevelWarn :
return colorYellow
case level == slog .LevelInfo :
return colorGreen
case level == slog .LevelDebug :
return colorCyan
default :
return colorReset
}
}
func (h *PrettyHandler ) Enabled (ctx context .Context , level slog .Level ) bool {
return h .handler .Enabled (ctx , level )
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .