60 lines
1.1 KiB
Go
60 lines
1.1 KiB
Go
package logger
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log/slog"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/lmittmann/tint"
|
|
)
|
|
|
|
var logger *slog.Logger
|
|
|
|
const LevelFatal slog.Level = slog.LevelError + 4
|
|
|
|
var (
|
|
Debug = makeLogFunc(slog.LevelDebug)
|
|
Info = makeLogFunc(slog.LevelInfo)
|
|
Warn = makeLogFunc(slog.LevelWarn)
|
|
Error = makeLogFunc(slog.LevelError)
|
|
Fatal = makeLogFunc(LevelFatal)
|
|
)
|
|
|
|
func init() {
|
|
w := os.Stderr
|
|
logger = slog.New(
|
|
tint.NewHandler(w, &tint.Options{
|
|
Level: slog.LevelDebug,
|
|
TimeFormat: time.RFC3339,
|
|
ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {
|
|
if a.Key == slog.LevelKey {
|
|
switch a.Value.Any() {
|
|
case LevelFatal:
|
|
return slog.Attr{
|
|
Key: slog.LevelKey,
|
|
Value: slog.StringValue("\x1b[91mFATAL\x1b[0m"),
|
|
}
|
|
}
|
|
}
|
|
return a
|
|
},
|
|
}),
|
|
)
|
|
slog.SetDefault(logger)
|
|
}
|
|
|
|
func makeLogFunc(level slog.Level) func(msg string, args ...any) {
|
|
return func(msg string, args ...any) {
|
|
if len(args) > 0 {
|
|
msg = fmt.Sprintf(msg, args...)
|
|
}
|
|
logger.Log(context.Background(), level, msg)
|
|
|
|
if level == LevelFatal {
|
|
os.Exit(1)
|
|
}
|
|
}
|
|
}
|