UNPKG

@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
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); } };