// Package logging configures the process-wide slog logger. package logging import ( "fmt" "io" "log/slog" "strings" ) // Options mirrors the logging section of the config file. type Options struct { Level string Format string AddSource bool } // ParseLevel maps a config string onto a slog level. func ParseLevel(s string) (slog.Level, error) { switch strings.ToLower(strings.TrimSpace(s)) { case "debug": return slog.LevelDebug, nil case "", "info": return slog.LevelInfo, nil case "warn", "warning": return slog.LevelWarn, nil case "error": return slog.LevelError, nil default: return 0, fmt.Errorf("unknown log level %q", s) } } // New builds a logger writing to w. It does not install it as the default. func New(w io.Writer, opts Options) (*slog.Logger, error) { level, err := ParseLevel(opts.Level) if err != nil { return nil, err } handlerOpts := &slog.HandlerOptions{Level: level, AddSource: opts.AddSource} var h slog.Handler switch strings.ToLower(strings.TrimSpace(opts.Format)) { case "", "text": h = slog.NewTextHandler(w, handlerOpts) case "json": h = slog.NewJSONHandler(w, handlerOpts) default: return nil, fmt.Errorf("unknown log format %q", opts.Format) } return slog.New(h), nil }