2026-06-15 17:53:42 +00:00
# logging
Shared Go library with logging primitives for all Shiny backend services.
## Shared Documentation
@../docs/claude/architecture.md
@../docs/claude/go-services.md
@../docs/claude/conventions.md
## Library Information
### Purpose
Single home for the `slog` setup, context-logger helpers, request-logging
middleware and the `MockLogger` test helper that were previously copied (with
drift) into every backend service.
### Usage
``` go
import (
"gitea.unbound.se/shiny/logging"
logmw "gitea.unbound.se/shiny/logging/middleware"
)
// Configure the slog default logger (format: text | json | otel).
logger := logging . SetupLogger ( cli . LogLevel , cli . LogFormat , serviceName , buildVersion )
// Carry a logger on the request context.
ctx = logging . ContextWithLogger ( ctx , logger )
logger = logging . LoggerFromContext ( ctx )
// Debug-log request/response bodies.
handler = logmw . RequestLogger ( logger ) ( handler )
```
In tests:
``` go
2026-06-19 16:43:26 +00:00
import logtest "gitea.unbound.se/shiny/logging/logtest"
m := logtest . NewMockLogger ( )
2026-06-15 17:53:42 +00:00
// ... exercise code with m.Logger() ...
m . Check ( t , [ ] string { "level=INFO msg=\"...\"" } )
```
### Exported API
- `SetupLogger(logLevel, logFormat, serviceName, buildVersion string) *slog.Logger`
- `ContextWithLogger(ctx, *slog.Logger) context.Context` / `LoggerFromContext(ctx) *slog.Logger`
2026-06-19 16:43:26 +00:00
- `logging/logtest.NewMockLogger() *MockLogger` (+ `MockLogger.Logger()` , `MockLogger.Check(t, want)` ) — the test helper, in its own sub-package so production code doesn't pull in testify.
2026-06-15 17:53:42 +00:00
- `logging/middleware.RequestLogger(logger) func(http.Handler) http.Handler` .
### Notes
2026-06-19 16:43:26 +00:00
- `MockLogger` /`NewMockLogger` live in the `logging/logtest` sub-package, so the
production `logging` package's import graph is free of `testify` — consumers
only compile it if they import `logtest` . (`testify` stays in the module's
`go.mod` because `logtest` and the library's own tests use it.)
2026-06-15 17:53:42 +00:00
### Conventions
Standard Shiny library scaffolding: `gofumpt` /`goimports -local` , golangci-lint,
gitleaks and conventional-commit checks via pre-commit; coverage-regression gate
in CI (`.testcoverage.yml` ); releases auto-tagged from conventional commits by
the shared Release workflow. Bump the consuming services' `go.mod` after a
release.