5.0 KiB
5.0 KiB
OpenSpec Change: enterprise-logger
- Change ID: enterprise-logger
- Package:
@suaveplan/logger - Category: universal
- Target path:
packages/universal/logger - Status: IN PROGRESS
- Date: 2026-04-18
- Reference spec:
/mnt/s/web/suaveplan/enterprise/logger.md
Summary
Greenfield implementation of @suaveplan/logger for the genesis branch. The existing main-branch logger (v1.23) provides the baseline public-API surface to preserve; this change adds enterprise-grade structured JSON output, declarative redaction, head/tail/rule-based sampling, OpenTelemetry correlation, pluggable sinks, property-based tests, and benchmarks.
Current-state audit (genesis)
The package does not exist on genesis yet — this is a fresh build.
Available workspace deps on genesis
| Package | Available |
|---|---|
@suaveplan/error |
✅ |
@suaveplan/events |
✅ |
@suaveplan/types |
✅ |
@suaveplan/timing |
❌ not yet built — use Clock from @suaveplan/types |
@suaveplan/storage |
❌ not yet built — keep StorageInterface locally |
@suaveplan/streams |
❌ not yet built — implement bounded buffer internally |
@suaveplan/opentelemetry |
❌ not yet built — use @opentelemetry/api directly |
@suaveplan/feature-flags |
❌ not yet built — skip |
@suaveplan/schema-registry |
❌ not yet built — export Zod schemas directly |
External deps (via catalog):
zod→catalog:forms@opentelemetry/api→catalog:observabilitytslib→catalog:build
Dev deps (via catalog):
vitest,@vitest/coverage-istanbul→catalog:testingfast-check→catalog:testingmitata→catalog:testing
Preserved public API surface (from main branch)
All of the following must be exported from the genesis build:
Types
LogLevel,LogEntry<TMetadata>,LoggerConfig<TMetadata>,LoggerMetricsConsoleLoggerConfig<TMetadata>EventLoggerConfig<TMetadata>,LoggerEvents<TMetadata>StorageLoggerConfig<TMetadata>,StorageInterfaceConsoleLoggerFactoryConfig<TMetadata>,StorageLoggerFactoryConfig<TMetadata>,EventLoggerFactoryConfig<TMetadata>,LoggerFactoryConfig<TMetadata>InitLoggerOptions<TMetadata>,InitLoggerResultSeverityLevelMap,UninstallErrorInterceptor,InstallErrorInterceptorOptions
Classes
AbstractLogger<TMetadata>(abstract)ConsoleLogger<TMetadata>EventLogger<TMetadata>StorageLogger<TMetadata>
Interfaces
Logger<TMetadata>LogLevels
Functions
createLogger(config)(overloaded factory)initLogger(options?)→InitLoggerResultinstallSuaveplanErrorInterceptor(logger?)→UninstallErrorInterceptor__resetDefaultLoggerForTests()
New additions
Modules
record/—LogRecordstructured JSON schema (Zod),ts/level/msg/ctx/trace_id/span_id/errorfieldserrors/—LoggerErrorextendingSuaveplanError; codes:LOGGER.SINK,LOGGER.SERIALIZE,LOGGER.CONFIG,LOGGER.FLUSHredaction/—RedactionEnginewith field-path rules (dot-notation + glob), regex rules, depth limit;@sensitive-aware viaisSensitive()from@suaveplan/errorsampling/—HeadSampler(deterministic per trace_id hash),TailSampler(bounded buffer + decision callback),RuleSampler(predicate-based);SamplingPolicyunion typesink/—Sinkinterface;ConsoleSink(ANSI dev output);JsonSink(NDJSON writer);BufferedSink(bounded queue, drop/block policy,AbortSignalflush)otel/—getOtelTraceContext()readstrace_id/span_idfrom active OTel span (no-op when no exporter)schemas/— Zod schemas forLoggerConfig,LogRecord, all sink configs (re-exported)
Cross-cutting enterprise requirements
- Injectable
clock(from@suaveplan/types#Clock) andrngon all time/random usages AbortSignalsupport onflush()andgetLogs()sideEffects: false+ tree-shake test- Property-based tests (fast-check) for redaction invariants and sampling determinism
- mitata benchmarks in
src/__benchmarks__/ - OTel counters + histograms on
log()calls (via@opentelemetry/api, no-op when unregistered) - Zero
any, zerots-ignore, zero mock usage in tests
Dependency-layer check
@suaveplan/logger depends on @suaveplan/error and @suaveplan/events, both of which are enterprise-complete on genesis. ✅
Acceptance criteria
bunx turbo lint typecheck test:coverage --filter=@suaveplan/loggergreen with ≥ 100% coverage on touched modulesbun run docs:check --filter=@suaveplan/loggerreports ≥ 90%- All preserved public API surface exported from
src/index.ts - New
LogRecordschema,LoggerError, redaction, sampling, sink, OTel modules implemented - Zero
any,ts-ignore,TODO,FIXME,@deprecated,.skip,.onlyinsrc/ - Property-based tests for redaction invariants and sampling determinism
- mitata benchmarks in
src/__benchmarks__/ sideEffects: falseconfirmed, tree-shake test passes