Files
logging/CLAUDE.md
T
argoyle a705fc33c4
logging / test (push) Has been skipped
logging / vulnerabilities (push) Has been skipped
Release / release (push) Successful in 56s
logging / coverage-baseline (push) Successful in 2m49s
pre-commit / pre-commit (push) Successful in 5m29s
feat: move MockLogger into a logtest sub-package (#5)
2026-06-19 16:43:26 +00:00

2.2 KiB

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

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:

import logtest "gitea.unbound.se/shiny/logging/logtest"

m := logtest.NewMockLogger()
// ... 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
  • 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.
  • logging/middleware.RequestLogger(logger) func(http.Handler) http.Handler.

Notes

  • 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.)

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.