import * as colors from "jsr:@std/fmt@^1.0.4/colors"; import * as log from "jsr:@std/log"; import { getEveFilePath } from "./files.ts"; export * as log from "jsr:@std/log"; export async function setupLogger() { const formatLevel = (level: number): string => { return ( { 10: colors.gray("[DEBUG]"), 20: colors.green("[INFO] "), 30: colors.yellow("[WARN] "), 40: colors.red("[ERROR]"), 50: colors.bgRed("[FATAL]"), }[level] || `[LVL${level}]` ); }; const levelName = (level: number): string => { return { 10: "DEBUG", 20: "INFO", 30: "WARN", 40: "ERROR", 50: "FATAL", }[level] || `LVL${level}`; }; const formatArg = (arg: unknown): string => { if (typeof arg === "object") return JSON.stringify(arg); return String(arg); }; await log.setup({ handlers: { console: new log.ConsoleHandler("DEBUG", { useColors: true, formatter: (record) => { const timestamp = new Date().toISOString(); let msg = `${colors.dim(`[${timestamp}]`)} ${ formatLevel(record.level) } ${record.msg}`; if (record.args.length > 0) { const args = record.args .map((arg, i) => `${colors.dim(`arg${i}:`)} ${formatArg(arg)}`) .join(" "); msg += ` ${colors.dim("|")} ${args}`; } return msg; }, }), file: new log.FileHandler("DEBUG", { filename: Deno.env.get("LOG_FILE") || await getEveFilePath("eve-logs.jsonl"), formatter: (record) => { const timestamp = new Date().toISOString(); return JSON.stringify({ timestamp, level: levelName(record.level), msg: record.msg, args: record.args, }); }, }), }, loggers: { default: { level: "DEBUG", handlers: ["console", "file"], }, }, }); }