import * as fs from "node:fs"; import * as path from "node:path"; const DATA_DIR = process.env.DATA_DIR || "./data"; const LOG_PATH = path.join(DATA_DIR, "app.log"); type LogLevel = "INFO" | "WARN" | "ERROR" | "DEBUG"; function formatDate(date: Date): string { return date.toISOString(); } function writeLog( level: LogLevel, message: string, meta?: Record, ) { const timestamp = formatDate(new Date()); const metaStr = meta ? ` ${JSON.stringify(meta)}` : ""; const logLine = `[${timestamp}] ${level}: ${message}${metaStr}\n`; // Write to file try { fs.appendFileSync(LOG_PATH, logLine); } catch (err) { // Fall back to console if file write fails console.error("Failed to write to log file:", err); } // Also write to stdout/stderr for systemd journal if (level === "ERROR") { process.stderr.write(logLine); } else { process.stdout.write(logLine); } } export const logger = { info: (message: string, meta?: Record) => writeLog("INFO", message, meta), warn: (message: string, meta?: Record) => writeLog("WARN", message, meta), error: (message: string, meta?: Record) => writeLog("ERROR", message, meta), debug: (message: string, meta?: Record) => { if (process.env.DEBUG) { writeLog("DEBUG", message, meta); } }, };