20 KiB
20 KiB
@suaveplan/logger - Foundation logging package — structured JSON output, level filtering, redaction, sampling, OTel correlation, and pluggable sinks.
Summary
Enterprise-grade structured logger for Suaveplan. Provides a full pipeline: level filtering → OTel trace enrichment → sampling → redaction → sinks. Supports multiple output strategies (console, JSON/NDJSON, event bus, storage) with buffering and backpressure.
Documentation tree
- abstract — (no submodules)
- abstract-logger — (no submodules)
- console — (no submodules)
- console-logger — (no submodules)
- error-bridge — (no submodules)
- error-bridge — (no submodules)
- errors — (no submodules)
- logger-error — (no submodules)
- event — (no submodules)
- event-logger — (no submodules)
- factory — (no submodules)
- factory — (no submodules)
- init — (no submodules)
- init — (no submodules)
- otel — (no submodules)
- otel-context — (no submodules)
- record — (no submodules)
- log-record — (no submodules)
- redaction — (no submodules)
- redaction — (no submodules)
- sampling — (no submodules)
- sampling — (no submodules)
- sink — (no submodules)
- buffered-sink —
BufferedSinkis an in-memory queuing wrapper around anySinkimplementation. It decouples the hot path of log recor… - console-sink —
ConsoleSinkis the human-readable terminal output sink for@suaveplan/logger. It formats eachLogRecordinto a si… - json-sink —
JsonSinkis the machine-readable structured output sink for@suaveplan/logger. It serialises eachLogRecordto a… - sink — (no submodules)
- buffered-sink —
- storage — (no submodules)
- storage-logger — (no submodules)
- console-sink —
ConsoleSinkis the human-readable terminal output sink for@suaveplan/logger. It formats eachLogRecordinto a si… - json-sink —
JsonSinkis the machine-readable structured output sink for@suaveplan/logger. It serialises eachLogRecordto a… - sink — (no submodules)- storage — (no submodules)- storage-logger — (no submodules)- abstract-logger — (no submodules)- console — (no submodules)- console-logger — (no submodules)- error-bridge — (no submodules)- error-bridge — (no submodules)- errors — (no submodules)- logger-error — (no submodules)- event — (no submodules)- event-logger — (no submodules)- factory — (no submodules)- factory — (no submodules)- init — (no submodules)- init — (no submodules)- otel — (no submodules)- otel-context — (no submodules)- record — (no submodules)- log-record — (no submodules)- redaction — (no submodules)- redaction — (no submodules)- sampling — (no submodules)- sampling — (no submodules)- sink — (no submodules)- buffered-sink —
BufferedSinkis an in-memory queuing wrapper around anySinkimplementation. It decouples the hot path of log recor… - console-sink —
ConsoleSinkis the human-readable terminal output sink for@suaveplan/logger. It formats eachLogRecordinto a si… - json-sink —
JsonSinkis the machine-readable structured output sink for@suaveplan/logger. It serialises eachLogRecordto a… - sink — (no submodules)- storage — (no submodules)- storage-logger — (no submodules)- abstract-logger — (no submodules)- console — (no submodules)- console-logger — (no submodules)- error-bridge — (no submodules)- error-bridge — (no submodules)- errors — (no submodules)- logger-error — (no submodules)- event — (no submodules)- event-logger — (no submodules)- factory — (no submodules)- factory — (no submodules)- init — (no submodules)- init — (no submodules)- otel — (no submodules)- otel-context — (no submodules)- record — (no submodules)- log-record — (no submodules)- redaction — (no submodules)- redaction — (no submodules)- sampling — (no submodules)- sampling — (no submodules)- sink — (no submodules)- buffered-sink —
BufferedSinkis an in-memory queuing wrapper around anySinkimplementation. It decouples the hot path of log recor… - console-sink —
ConsoleSinkis the human-readable terminal output sink for@suaveplan/logger. It formats eachLogRecordinto a si… - json-sink —
JsonSinkis the machine-readable structured output sink for@suaveplan/logger. It serialises eachLogRecordto a… - sink — (no submodules)- storage — (no submodules)- storage-logger — (no submodules)- abstract-logger — (no submodules)- console — (no submodules) - console-logger — (no submodules)- error-bridge — (no submodules) - error-bridge — (no submodules)- errors — (no submodules) - logger-error — (no submodules)- event — (no submodules) - event-logger — (no submodules)- factory — (no submodules) - factory — (no submodules)- init — (no submodules) - init — (no submodules)- otel — (no submodules) - otel-context — (no submodules)- record — (no submodules) - log-record — (no submodules)- redaction — (no submodules) - redaction — (no submodules)- sampling — (no submodules) - sampling — (no submodules)- sink — (no submodules) - buffered-sink —
BufferedSinkis an in-memory queuing wrapper around anySinkimplementation. It decouples the hot path of log recor… - console-sink —
ConsoleSinkis the human-readable terminal output sink for@suaveplan/logger. It formats eachLogRecordinto a si… - json-sink —
JsonSinkis the machine-readable structured output sink for@suaveplan/logger. It serialises eachLogRecordto a… - sink — (no submodules)- storage — (no submodules) - storage-logger — (no submodules)
Features
- Structured logging —
LogRecordwith level, message, ISO timestamp, context bag, trace IDs - Level filtering —
debug | info | warn | errorwith hierarchical cutoff - OTel enrichment — auto-injects
trace_id/span_idfrom the active OpenTelemetry span - Sampling —
HeadSampler(deterministic FNV1a),TailSampler(buffered),RuleSampler,SampleAll/None - Redaction — path-based and regex-pattern rules; respects
@suaveplan/errorisSensitive()markers - Pluggable sinks —
ConsoleSink,JsonSink(NDJSON),BufferedSink(async queue, backpressure),MultiSink - Concrete loggers —
ConsoleLogger,EventLogger(event-bus integration),StorageLogger(KV persistence) - Error bridge — installs a global
SuaveplanErrorinterceptor so unhandled errors are logged automatically - Factory API —
createLogger(config)for declarative setup;initLogger(config)for one-call bootstrap
Installation
bun add @suaveplan/logger
Quick Start
import { initLogger } from "@suaveplan/logger/init/init";
import { ConsoleLogger } from "@suaveplan/logger/console/console-logger";
// Option 1 — factory bootstrap
const logger = initLogger({ type: "console", level: "info" });
logger.info("server started", { port: 3000 });
// Option 2 — direct construction
const log = new ConsoleLogger({ level: "debug", colors: true, timestamp: true });
log.debug("connecting", { host: "db.local" });
log.warn("slow query", { ms: 412 });
Modules
| Module | Description |
|---|---|
src/abstract/abstract-logger |
Base pipeline class — all concrete loggers extend this |
src/record/log-record |
LogRecord type and Zod validation schemas |
src/errors/logger-error |
LoggerError + LOGGER_CODES error registry |
src/otel/otel-context |
OTel trace/span context extractor |
src/sampling/sampling |
All sampler implementations and createSampler factory |
src/redaction/redaction |
RedactionEngine and applyRedaction utility |
src/sink/sink |
Sink interface, MultiSink, flushSink, closeSink |
src/sink/console-sink |
ANSI-colored human-readable console output |
src/sink/json-sink |
NDJSON structured output to any writer |
src/sink/buffered-sink |
Async queue with configurable overflow policies |
src/console/console-logger |
Ready-to-use console logger |
src/event/event-logger |
Event-bus logger with per-level subscriptions |
src/storage/storage-logger |
KV-backed persistent logger with batch flush |
src/error-bridge/error-bridge |
Global SuaveplanError interceptor |
src/factory/factory |
Declarative createLogger factory |
src/init/init |
One-call initLogger bootstrap with global accessor |
Usage: Redaction
import { ConsoleLogger } from "@suaveplan/logger/console/console-logger";
const log = new ConsoleLogger({
level: "info",
redaction: {
rules: [
{ kind: "path", path: "user.password" },
{ kind: "pattern", pattern: /token/i },
],
},
});
log.info("login", { user: { password: "s3cr3t", email: "a@b.com" }, token: "xyz" });
// → password and token fields are replaced with "[REDACTED]"
Usage: Sampling
import { createLogger } from "@suaveplan/logger/factory/factory";
const logger = createLogger({
type: "console",
level: "debug",
sampling: { kind: "head", options: { rate: 0.1 } }, // keep 10%
});
Usage: Buffered JSON sink
import { BufferedSink } from "@suaveplan/logger/sink/buffered-sink";
import { JsonSink } from "@suaveplan/logger/sink/json-sink";
const inner = new JsonSink({ writer: (line) => fs.appendFileSync("app.log", line + "\n") });
const sink = new BufferedSink({ sink: inner, maxQueueSize: 1000, overflowPolicy: "drop" });
// ... on shutdown:
await sink.flush();
await sink.close();
Usage: StorageLogger
import { StorageLogger } from "@suaveplan/logger/storage/storage-logger";
const logger = new StorageLogger(kvStorage, {
level: "info",
autoFlush: true,
flushInterval: 10_000,
maxBatchSize: 100,
});
logger.error("payment failed", { orderId: "ord_123" });
const recent = await logger.getLogs({ limit: 50 });
await logger.clearLogs(new Date(Date.now() - 7 * 86400_000)); // purge >7 days old
Usage: Error bridge
import { installSuaveplanErrorInterceptor } from "@suaveplan/logger/error-bridge/error-bridge";
import { ConsoleLogger } from "@suaveplan/logger/console/console-logger";
const log = new ConsoleLogger({ level: "warn" });
installSuaveplanErrorInterceptor(log); // all future SuaveplanErrors are logged automatically
API Reference
See each module's co-located .md file (linked in the table above) for full parameter and return-type documentation.
License
Private — Suaveplan internal use only.