Stream beets imports over HTTP.

refactor(server,middleware): inject logger explicitly and drop global slog default #18

Merged glerp.sullen.net
targeting main from glerp.sullen.net/goosefoot:hygiene/explicit-logger-injection
Merged opened by and assigned to glerp.sullen.net
targeting main from glerp.sullen.net/goosefoot:hygiene/explicit-logger-injection

Motivation #

Previously, cmd/goosefoot constructed a *slog.Logger and mutated the process-wide global default via slog.SetDefault(logger) because server.New and middleware.Logging had no explicit logger dependency:

  • middleware.Logging reached into log.FromContext(r.Context()) on incoming requests, implicitly falling back to slog.Default() in production and requiring unit tests to pre-populate req.Context() before the middleware ran.
  • server.New accepted runner explicitly but omitted *slog.Logger, leaving http.Server.ErrorLog bound to the global log.Default() writer and causing server unit tests to leak request logs to global os.Stderr.
  • Calling run() in cmd/goosefoot tests overwrote process-global slog and log state with test-scoped buffers.

Summary of Changes #

  • internal/middleware: Change Logging(base *slog.Logger) func(http.Handler) http.Handler to accept its base logger explicitly at construction time (aligning with Auth and MaxBodySize), fail fast on nil, and attach the enriched request logger to r.Context() for downstream handlers.
  • internal/server: Require a non-nil *slog.Logger in server.New(cfg, runner, logger), wire middleware.Logging(s.logger) on the router, and route http.Server.ErrorLog through slog.NewLogLogger(s.logger.Handler(), slog.LevelError).
  • cmd/goosefoot: Pass logger directly to server.New and remove the global slog.SetDefault(logger) mutation.
  • Tests: Update middleware and server tests to inject loggers through public constructors (slog.DiscardHandler by default in newTestServer), and add coverage for fail-fast nil logger checks and preservation of slog.Default() across run().
Commits 0