@b2y/document-module
Version:
A flexible multi-provider storage adapter for file operations across S3, Azure Blob, Google Drive, and local storage
82 lines (69 loc) • 2.43 kB
JavaScript
const log4js = require('log4js');
const path = require('path');
const fs = require('fs');
// Get log directory from environment variable or use default
const LOG_DIR = process.env.LOG_DIR || path.join(process.cwd(), '..', 'logs');
// Ensure the log directory exists
if (!fs.existsSync(LOG_DIR)) {
fs.mkdirSync(LOG_DIR, { recursive: true });
}
log4js.configure({
appenders: {
console: { type: 'console' },
combined: {
type: 'file',
filename: path.join(LOG_DIR, 'storage.log'),
maxLogSize: 5 * 1024 * 1024, // 5MB
backups: 100,
compress: true,
keepFileExt: true
}
},
categories: { default: { appenders: ['console', 'combined'], level: 'debug' } }
});
// Function to get the caller file name
const getCallerFile = () => {
const originalFunc = Error.prepareStackTrace;
let callerFile;
try {
const err = new Error();
Error.prepareStackTrace = (_, stack) => stack;
const stack = err.stack;
for (let i = 0; i < stack.length; i++) {
const fileName = stack[i].getFileName();
if (fileName && !fileName.includes('logger.js') && !fileName.includes('node_modules')) {
callerFile = path.basename(fileName);
break;
}
}
} catch (error) {
callerFile = 'unknown';
}
Error.prepareStackTrace = originalFunc;
return callerFile || 'unknown';
};
// Custom logger function to attach file name dynamically
const log = (level, message, data) => {
const fileName = getCallerFile();
log4js.getLogger(fileName)[level](message, data);
};
module.exports = {
debug: (message, data) => log('debug', message, data),
info: (message, data) => log('info', message, data),
warn: (message, data) => log('warn', message, data),
error: (message, errorOrData) => {
let enhancedData = errorOrData;
if (errorOrData instanceof Error) {
const { file, line, column } = getErrorDetails(errorOrData);
enhancedData = {
error: errorOrData.message,
stack: errorOrData.stack,
location: `${file}:${line}:${column}`
};
} else if (errorOrData && errorOrData.error instanceof Error) {
const { file, line, column } = getErrorDetails(errorOrData.error);
enhancedData = { ...errorOrData, location: `${file}:${line}:${column}` };
}
log('error', message, enhancedData);
}
};