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 |
package logger
import (
"context"
"errors"
"log/slog"
"os"
"github.com/olexsmir/onasty/internal/transport/http/reqid"
)
type CustomLogger struct{ slog.Handler }
//nolint:err113
func NewCustomLogger(lvl, format string, showLine bool) (*slog.Logger, 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 nil, errors.New("unknown log level")
}
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 nil, errors.New("unknown log format")
}
return slog.New(&CustomLogger{Handler: slogHandler}), nil
}
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)
}
|