package logger import ( "context" "fmt" "log/slog" "os" ) type contextKey struct{} // New constructs a root logger for the configured format and level. func New(format, level string) *slog.Logger { var parsed slog.Level if err := parsed.UnmarshalText([]byte(level)); err != nil { _, _ = fmt.Fprintf(os.Stderr, "invalid log level %q, falling back to info\n", level) parsed = slog.LevelInfo } opts := &slog.HandlerOptions{Level: parsed} if format == "json" { return slog.New(slog.NewJSONHandler(os.Stdout, opts)) } return slog.New(slog.NewTextHandler(os.Stdout, opts)) } // WithLogger attaches a logger to the provided context. func WithLogger(ctx context.Context, l *slog.Logger) context.Context { return context.WithValue(ctx, contextKey{}, l) } // FromContext retrieves a logger from context and falls back to slog.Default(). func FromContext(ctx context.Context) *slog.Logger { if l, ok := ctx.Value(contextKey{}).(*slog.Logger); ok && l != nil { return l } return slog.Default() }