36 lines
1.3 KiB
TypeScript
36 lines
1.3 KiB
TypeScript
import { appendFileSync, mkdirSync } from 'node:fs';
|
|||
|
|
import { fileURLToPath } from 'node:url';
|
||
|
|
|
||
|
|
// Log a archivo, uno por día (logs/dispatcher-YYYY-MM-DD.log), además de
|
||
|
|
// consola — para que un servicio Windows (NSSM/PM2/Task Scheduler, ver
|
||
|
|
// README) no dependa de que algo capture su stdout. Formato de línea
|
||
|
|
// simple (timestamp ISO + nivel entre corchetes) para que lo pueda leer
|
||
|
|
// cualquier visualizador de logs genérico (ej. lnav, o un `tail -f`).
|
||
|
|
const LOGS_DIR = fileURLToPath(new URL('../../logs/', import.meta.url));
|
||
|
|
mkdirSync(LOGS_DIR, { recursive: true });
|
||
|
|
|
||
|
|
function logFilePath(date: Date): string {
|
||
|
|
const day = date.toISOString().slice(0, 10);
|
||
|
|
return `${LOGS_DIR}dispatcher-${day}.log`;
|
||
|
|
}
|
||
|
|
|
||
|
|
function write(level: string, message: string): void {
|
||
|
|
const now = new Date();
|
||
|
|
appendFileSync(logFilePath(now), `${now.toISOString()} [${level}] ${message}\n`);
|
||
|
|
}
|
||
|
|
|
||
|
|
export const logger = {
|
||
|
|
info(message: string): void {
|
||
|
|
console.log(message);
|
||
|
|
write('INFO', message);
|
||
|
|
},
|
||
|
|
warn(message: string): void {
|
||
|
|
console.warn(message);
|
||
|
|
write('WARN', message);
|
||
|
|
},
|
||
|
|
error(message: string, err?: unknown): void {
|
||
|
|
const detail = err instanceof Error ? (err.stack ?? err.message) : err !== undefined ? String(err) : '';
|
||
|
|
console.error(message, err ?? '');
|
||
|
|
write('ERROR', detail ? `${message} ${detail}` : message);
|
||
|
|
},
|
||
|
|
};
|