tinfo-web-server / utils /errorLogger.js
Faridaqurr
initial backend
e8c33fa
Raw
History Blame Contribute Delete
1.8 kB
const { env } = require('../configs/env');
const logger = require('./logger');
const MAX_ENTRIES = 500;
const memoryLog = [];
const logError = (error, context = {}) => {
try {
const err = error instanceof Error ? error : new Error(String(error ?? 'Unknown error'));
const entry = {
timestamp: new Date().toISOString(),
type: err.name || 'Error',
message: err.message || 'Unknown error',
stack: err.stack || '',
code: context.code || 'INTERNAL_SERVER_ERROR',
statusCode: context.statusCode || 500,
request: {
url: context.req?.originalUrl || '',
method: context.req?.method || '',
ip: context.req?.ip || '',
userAgent: context.req?.headers?.['user-agent'] || '',
// Log field names only — not values, to protect sensitive data
bodyFields: context.req?.body && typeof context.req.body === 'object' && !Array.isArray(context.req.body)
? Object.keys(context.req.body)
: [],
},
userId: context.req?.user?.id || context.userId || '',
env: env.nodeEnv,
};
logger.error("Request error", { type: entry.type, message: entry.message, code: entry.code, status: entry.statusCode });
memoryLog.unshift(entry);
if (memoryLog.length > MAX_ENTRIES) {
memoryLog.length = MAX_ENTRIES;
}
if (env.isProduction) {
// Lazy require to avoid loading Mongoose at startup if DB is not yet connected
const ErrorLog = require('../models/ErrorLog');
ErrorLog.create(entry).catch(() => {});
}
} catch {
// logError must never throw — swallow all errors
}
};
const getMemoryLog = () => [...memoryLog];
const clearMemoryLog = () => {
memoryLog.length = 0;
};
module.exports = { logError, getMemoryLog, clearMemoryLog };