| 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(); |
|
|
| |
| |
| |
| |
| const LOG_RETENTION_MS = 30 * 60 * 1000; |
| const MAX_BUFFER_SIZE = 5000; |
|
|
| 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) { |
| |
| } |
| } |
|
|
| |
| |
| ["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); |
| }; |
| }); |
|
|
| |
| |
| |
| function getRecentLogs() { |
| const cutoff = Date.now() - LOG_RETENTION_MS; |
| return logBuffer.filter((l) => l.time >= cutoff); |
| } |
|
|
| module.exports = { |
| logger, |
| getRecentLogs |
| } |