// src/lib/logger.ts // ───────────────────────────────────────────────────────────────────────────── // Minimal structured logger — JSON lines per event so `docker logs flux-app` // can be piped through `jq` and shipped to Loki/Sentry/CloudWatch without code // changes. Zero deps. Replace console.error/log with log.error/log.info. // ───────────────────────────────────────────────────────────────────────────── type LogContext = Record; function serialiseError(err: unknown) { if (err instanceof Error) { return { name: err.name, message: err.message, stack: err.stack }; } return { value: String(err) }; } function emit(level: "info" | "warn" | "error", event: string, ctx?: LogContext, err?: unknown) { const line = JSON.stringify({ lvl: level, event, ts: new Date().toISOString(), ...(err !== undefined ? { err: serialiseError(err) } : {}), ...ctx, }); if (level === "error") console.error(line); else if (level === "warn") console.warn(line); else console.log(line); } export const log = { info: (event: string, ctx?: LogContext) => emit("info", event, ctx), warn: (event: string, ctx?: LogContext) => emit("warn", event, ctx), error: (event: string, err: unknown, ctx?: LogContext) => emit("error", event, ctx, err), };