/** * logger.js * Handles logging functionality */ const fs = require('fs'); const path = require('path'); const { LOGGING_CONFIG } = require('../config/appConfig'); // Define log levels and their priority (higher number = higher priority) const LOG_LEVELS = { DEBUG: 1, INFO: 2, WARN: 3, ERROR: 4 }; // Get configured log level from config, default to INFO if not specified const configuredLevel = (LOGGING_CONFIG?.level || 'info').toUpperCase(); const configuredLevelValue = LOG_LEVELS[configuredLevel] || LOG_LEVELS.INFO; // Ensure logs directory exists const LOGS_DIR = path.join(__dirname, '..', '..', 'logs'); if (!fs.existsSync(LOGS_DIR)) { fs.mkdirSync(LOGS_DIR, { recursive: true }); } // Use log file from config if available, otherwise use default const LOG_FILE = LOGGING_CONFIG?.file ? path.resolve(path.join(__dirname, '..', '..'), LOGGING_CONFIG.file) : path.join(LOGS_DIR, 'fylgja.log'); // Create logger object const logger = { /** * Internal method to write log entry to file and console if level meets threshold * @param {string} level - Log level (DEBUG, INFO, WARN, ERROR) * @param {string} message - Log message to write */ _writeToFile: (level, message) => { // Check if this log level should be displayed based on configured level const levelValue = LOG_LEVELS[level] || 0; if (levelValue >= configuredLevelValue) { const timestamp = new Date().toISOString(); const logEntry = `${timestamp} ${level}: ${message}\n`; // Append to log file try { fs.appendFileSync(LOG_FILE, logEntry); } catch (err) { console.error(`Failed to write to log file: ${err.message}`); } // Also log to console with appropriate method switch (level) { case 'ERROR': console.error(logEntry.trim()); break; case 'WARN': console.warn(logEntry.trim()); break; case 'DEBUG': console.debug(logEntry.trim()); break; case 'INFO': default: console.info(logEntry.trim()); } } }, /** * Log an info message * @param {string} message - Message to log */ info: (message) => logger._writeToFile('INFO', message), /** * Log an error message * @param {string} message - Message to log */ error: (message) => logger._writeToFile('ERROR', message), /** * Log a warning message * @param {string} message - Message to log */ warn: (message) => logger._writeToFile('WARN', message), /** * Log a debug message * @param {string} message - Message to log */ debug: (message) => logger._writeToFile('DEBUG', message), /** * Get the current log level * @returns {string} Current log level */ getLogLevel: () => configuredLevel }; module.exports = logger;