multica/apps/web/shared/logger.ts
Naiyuan Qing 8983a9fefa feat(logging): add structured logging across server and SDK
Replace raw fmt/log calls with structured slog logger (Go) and
console-based logger (TypeScript). Add request logging middleware.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 10:57:11 +08:00

51 lines
1.3 KiB
TypeScript

type LogLevel = "debug" | "info" | "warn" | "error";
const COLORS: Record<LogLevel, string> = {
debug: "color:#888",
info: "color:#2196F3",
warn: "color:#FF9800",
error: "color:#F44336;font-weight:bold",
};
const CONSOLE_METHOD: Record<LogLevel, "log" | "info" | "warn" | "error"> = {
debug: "log",
info: "info",
warn: "warn",
error: "error",
};
export interface Logger {
debug(msg: string, ...data: unknown[]): void;
info(msg: string, ...data: unknown[]): void;
warn(msg: string, ...data: unknown[]): void;
error(msg: string, ...data: unknown[]): void;
}
export function createLogger(namespace: string): Logger {
const make =
(level: LogLevel) =>
(msg: string, ...data: unknown[]) => {
const ts = new Date().toISOString().slice(11, 23);
const prefix = `%c${ts} [${namespace}]`;
if (data.length > 0) {
console[CONSOLE_METHOD[level]](prefix, COLORS[level], msg, ...data);
} else {
console[CONSOLE_METHOD[level]](prefix, COLORS[level], msg);
}
};
return {
debug: make("debug"),
info: make("info"),
warn: make("warn"),
error: make("error"),
};
}
/** No-op logger for when logging is not needed. */
export const noopLogger: Logger = {
debug() {},
info() {},
warn() {},
error() {},
};