Structured logging helpers around log/slog: tee handlers, optional JSON file rotation, optional email alerts, build metadata.
Store a request scoped *slog.Logger on context.Context so middleware can attach fields once (for example request_id) and downstream code logs without threading a logger parameter.
gklog.WithLogger(ctx, log)storeslogonctx(or returnsctxunchanged whenlogis nil).gklog.LoggerFromContext(ctx)returns that logger, orslog.Default()when none was stored.gklog.L(ctx)is a short alias forLoggerFromContext.
Downstream should prefer LoggerFromContext(ctx).InfoContext(ctx, msg, ...) so the record carries the same context through slog handlers.
After merging changes, tag a new version (or let consumers pin a pseudo version with go get goodkind.io/gklog@<commit>). Downstream modules update their require and drop any temporary replace directives pointing at a local checkout.