process.env.TZ = "Europe/Istanbul"; const log4js = require("log4js"); const util = require("util"); log4js.configure({ appenders: { console: { type: "console" }, }, categories: { default: { appenders: ["console"], level: "info" } }, layouts: { customLayout: { type: 'pattern', pattern: '%d{hh:mm:ss} %-5p %c - %m', } } }); const logger = log4js.getLogger(); // --- WEB PANEL İÇİN BELLEK İÇİ LOG TAMPONU --- // log4js'in kendisi "son X dakikanın logları" diye bir şey sunmuyor, o yüzden // her log çağrısını (console'a yazmaya ek olarak) burada da saklıyoruz. // Varsayılan tutma süresi 30 dakika; bu sürenin dışındaki kayıtlar otomatik atılır. const LOG_RETENTION_MS = 30 * 60 * 1000; const MAX_BUFFER_SIZE = 5000; // Aşırı log patlaması durumunda RAM'i sınırlamak için güvenlik tavanı let logBuffer = []; function pruneOldLogs() { const cutoff = Date.now() - LOG_RETENTION_MS; while (logBuffer.length && logBuffer[0].time < cutoff) { logBuffer.shift(); } if (logBuffer.length > MAX_BUFFER_SIZE) { logBuffer.splice(0, logBuffer.length - MAX_BUFFER_SIZE); } } function formatArgs(args) { try { return args .map((a) => (typeof a === "string" ? a : util.inspect(a, { depth: 2 }))) .join(" "); } catch (e) { return "[loglanamayan mesaj]"; } } function pushToBuffer(level, args) { try { logBuffer.push({ time: Date.now(), level, message: formatArgs(args) }); pruneOldLogs(); } catch (e) { // Log tamponuna yazarken bile bir hata olursa asıl process'i etkilemesin } } // logger.info / warn / error / debug / trace / fatal çağrılarını, orijinal // davranışlarını bozmadan, aynı zamanda tampona da yazacak şekilde sarmalıyoruz. ["trace", "debug", "info", "warn", "error", "fatal"].forEach((level) => { if (typeof logger[level] !== "function") return; const original = logger[level].bind(logger); logger[level] = (...args) => { pushToBuffer(level, args); return original(...args); }; }); // Web panelden çağrılacak: HER ZAMAN son 30 dakikanın loglarını döner. // Kasıtlı olarak parametre almıyor — süre dışarıdan (istekle) değiştirilemesin, // tampon zaten her yazımda 30 dk'dan eskisini otomatik siliyor (RAM güvenliği). function getRecentLogs() { const cutoff = Date.now() - LOG_RETENTION_MS; return logBuffer.filter((l) => l.time >= cutoff); } module.exports = { logger, getRecentLogs }