Spaces:
Paused
Paused
File size: 2,051 Bytes
b1107bc | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | /**
* Structured logger — JSON in production, readable in development.
*
* Usage:
* import { log } from "../utils/logger.js";
* log.info("Request received", { method: "POST", path: "/v1/chat/completions" });
* log.warn("Stale lock", { entryId: "abc" });
* log.error("Curl failed", { code: 1, stderr: "..." });
*/
type LogLevel = "debug" | "info" | "warn" | "error";
const LEVEL_PRIORITY: Record<LogLevel, number> = {
debug: 0,
info: 1,
warn: 2,
error: 3,
};
const isProduction = process.env.NODE_ENV === "production";
const minLevel: LogLevel = (process.env.LOG_LEVEL as LogLevel) ?? (isProduction ? "info" : "debug");
function shouldLog(level: LogLevel): boolean {
return LEVEL_PRIORITY[level] >= LEVEL_PRIORITY[minLevel];
}
function emit(level: LogLevel, message: string, extra?: Record<string, unknown>): void {
if (!shouldLog(level)) return;
if (isProduction) {
// JSON structured output for container/log aggregator consumption
const entry: Record<string, unknown> = {
ts: new Date().toISOString(),
level,
msg: message,
...extra,
};
const line = JSON.stringify(entry);
if (level === "error") {
process.stderr.write(line + "\n");
} else {
process.stdout.write(line + "\n");
}
} else {
// Human-readable for development
const prefix = `[${level.toUpperCase()}]`;
const parts: unknown[] = [prefix, message];
if (extra && Object.keys(extra).length > 0) {
parts.push(extra);
}
if (level === "error") {
console.error(...parts);
} else if (level === "warn") {
console.warn(...parts);
} else {
console.log(...parts);
}
}
}
export const log = {
debug: (msg: string, extra?: Record<string, unknown>) => emit("debug", msg, extra),
info: (msg: string, extra?: Record<string, unknown>) => emit("info", msg, extra),
warn: (msg: string, extra?: Record<string, unknown>) => emit("warn", msg, extra),
error: (msg: string, extra?: Record<string, unknown>) => emit("error", msg, extra),
};
|