Files
UHD_Media_Tool/spikes/deno/apps/server/src/log-logtape.ts
T
2026-09-27 18:24:08 +08:00

13 lines
1.1 KiB
TypeScript

// LogTape alternative: JSON lines + redaction sink wrapper.
import { configure, getJsonLinesFormatter, getLogger, getStreamSink, type LogRecord, type Sink } from "@logtape/logtape";
import { redact, redactString } from "@spike/x";
const base = getStreamSink(Deno.stdout.writable, { formatter: getJsonLinesFormatter() });
const redacting = (inner: Sink): Sink => (r: LogRecord) =>
inner({ ...r, message: r.message.map((m: unknown) => (typeof m === "string" ? redactString(m) : redact(m))), rawMessage: typeof r.rawMessage === "string" ? redactString(r.rawMessage) : r.rawMessage, properties: redact(r.properties) as Record<string, unknown> });
await configure({ sinks: { out: redacting(base) }, loggers: [{ category: ["umt"], lowestLevel: "info", sinks: ["out"] }, { category: ["logtape", "meta"], lowestLevel: "warning", sinks: ["out"] }] });
const log = getLogger(["umt", "worker"]);
log.info("fetch {url}", { url: "https://x/rss?passkey=SECRET", token: "abc", n: 3 });
log.with({ runId: "r1", apiKey: "k" }).warn("child context");
await new Promise((r) => setTimeout(r, 100));