onasty/internal/logger/logger.go(view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
package logger
import (
"context"
"errors"
"log/slog"
"os"
"github.com/olexsmir/onasty/internal/transport/http/reqid"
)
var (
ErrUnknownLevel = errors.New("unknown log level")
ErrUnknownFormat = errors.New("unknown log format")
)
// SetDefault configures and set default [slog.Logger]
func SetDefault(lvl, format string, showLine bool) error {
loggerLevels := map[string]slog.Level{
"info": slog.LevelInfo,
"debug": slog.LevelDebug,
"error": slog.LevelError,
"warn": slog.LevelWarn,
}
logLevel, ok := loggerLevels[lvl]
if !ok {
return ErrUnknownLevel
}
handlerOptions := &slog.HandlerOptions{
Level: logLevel,
AddSource: showLine,
}
var slogHandler slog.Handler
switch format {
case "json":
slogHandler = slog.NewJSONHandler(os.Stdout, handlerOptions)
case "text", "txt":
slogHandler = slog.NewTextHandler(os.Stdout, handlerOptions)
default:
return ErrUnknownFormat
}
slog.SetDefault(slog.New(&CustomLogger{Handler: slogHandler}))
return nil
}
type CustomLogger struct{ slog.Handler }
func (l *CustomLogger) Handle(ctx context.Context, r slog.Record) error {
if requestID := reqid.GetContext(ctx); requestID != "" {
r.AddAttrs(slog.String("request_id", requestID))
}
return l.Handler.Handle(ctx, r)
}
|