48 lines
1.5 KiB
JavaScript
48 lines
1.5 KiB
JavaScript
import { readdirSync, statSync, unlinkSync, truncateSync } from "fs";
|
|
import { resolve } from "path";
|
|
|
|
const LOG_DIR = resolve(import.meta.dirname || new URL(".", import.meta.url).pathname, "..", "logs");
|
|
const MAX_AGE_DAYS = 7;
|
|
const MAX_SIZE_BYTES = 10 * 1024 * 1024; // 10MB
|
|
|
|
function cleanup() {
|
|
console.log(`[cleanup-logs] Scanning ${LOG_DIR}...`);
|
|
let files;
|
|
try {
|
|
files = readdirSync(LOG_DIR);
|
|
} catch {
|
|
console.log("[cleanup-logs] Log directory not found, skipping.");
|
|
return;
|
|
}
|
|
|
|
const now = Date.now();
|
|
const maxAge = MAX_AGE_DAYS * 24 * 60 * 60 * 1000;
|
|
let deleted = 0;
|
|
let truncated = 0;
|
|
|
|
for (const file of files) {
|
|
if (!file.endsWith(".log")) continue;
|
|
const filePath = resolve(LOG_DIR, file);
|
|
try {
|
|
const stat = statSync(filePath);
|
|
const age = now - stat.mtimeMs;
|
|
|
|
if (age > maxAge && file !== "cron.log") {
|
|
unlinkSync(filePath);
|
|
deleted++;
|
|
console.log(` 🗑️ Deleted ${file} (age: ${(age / 86400000).toFixed(1)}d)`);
|
|
} else if (stat.size > MAX_SIZE_BYTES) {
|
|
truncateSync(filePath, MAX_SIZE_BYTES / 2);
|
|
truncated++;
|
|
console.log(` ✂️ Truncated ${file} (${(stat.size / 1024 / 1024).toFixed(1)}MB → ${(MAX_SIZE_BYTES / 2 / 1024 / 1024).toFixed(1)}MB)`);
|
|
}
|
|
} catch (e) {
|
|
console.warn(` ⚠️ Error processing ${file}: ${e.message}`);
|
|
}
|
|
}
|
|
|
|
console.log(`[cleanup-logs] Done. Deleted: ${deleted}, Truncated: ${truncated}`);
|
|
}
|
|
|
|
cleanup();
|