Files

35 lines
1.2 KiB
JavaScript
Raw Permalink Normal View History

2026-09-13 20:23:05 +01:00
import fs from 'node:fs/promises';
import path from 'node:path';
import { LOG_FILE } from './config.js';
// Simple JSON-lines log stored on the data volume. Newest entries are returned
// first for the management page.
export async function logEvent({ level = 'info', actor = 'system', action = 'event', message = '', meta } = {}) {
const entry = { ts: Date.now(), level, actor, action, message, ...(meta ? { meta } : {}) };
try {
await fs.mkdir(path.dirname(LOG_FILE), { recursive: true });
await fs.appendFile(LOG_FILE, JSON.stringify(entry) + '\n');
} catch {
// Logging must never take the app down.
}
const tag = level === 'error' ? 'ERROR' : level === 'warn' ? 'warn' : 'log';
console.log(`[${tag}] ${action}: ${message}`);
return entry;
}
export async function readLogs(limit = 300) {
try {
const raw = await fs.readFile(LOG_FILE, 'utf8');
const lines = raw.split('\n').filter(Boolean);
return lines.slice(-limit).reverse().map((l) => {
try { return JSON.parse(l); } catch { return { ts: 0, level: 'info', message: l }; }
});
} catch {
return [];
}
}
export async function clearLogs() {
try { await fs.writeFile(LOG_FILE, ''); } catch {}
}