// /server/core/logger.js /** * Простой логгер-обертка. * В будущем можно заменить на более продвинутое решение (Winston, Pino), * сохранив этот же интерфейс. */ const LOG_LEVELS = { DEBUG: 'DEBUG', INFO: 'INFO', WARN: 'WARN', ERROR: 'ERROR', FATAL: 'FATAL' }; // Можно установить минимальный уровень логирования из переменной окружения или конфига const CURRENT_LOG_LEVEL = process.env.LOG_LEVEL || LOG_LEVELS.INFO; function shouldLog(level) { const levelsOrder = [LOG_LEVELS.DEBUG, LOG_LEVELS.INFO, LOG_LEVELS.WARN, LOG_LEVELS.ERROR, LOG_LEVELS.FATAL]; return levelsOrder.indexOf(level) >= levelsOrder.indexOf(CURRENT_LOG_LEVEL); } function formatMessage(level, moduleName, message, ...optionalParams) { const timestamp = new Date().toISOString(); let formattedMessage = `${timestamp} [${level}]`; if (moduleName) { formattedMessage += ` [${moduleName}]`; } formattedMessage += `: ${message}`; // Обработка дополнительных параметров (например, объектов ошибок) const paramsString = optionalParams.map(param => { if (param instanceof Error) { return `\n${param.stack || param.message}`; } if (typeof param === 'object') { try { return `\n${JSON.stringify(param, null, 2)}`; } catch (e) { return '\n[Unserializable Object]'; } } return param; }).join(' '); return `${formattedMessage}${paramsString ? ' ' + paramsString : ''}`; } const logger = { debug: (moduleName, message, ...optionalParams) => { if (shouldLog(LOG_LEVELS.DEBUG)) { console.debug(formatMessage(LOG_LEVELS.DEBUG, moduleName, message, ...optionalParams)); } }, info: (moduleName, message, ...optionalParams) => { if (shouldLog(LOG_LEVELS.INFO)) { console.info(formatMessage(LOG_LEVELS.INFO, moduleName, message, ...optionalParams)); } }, warn: (moduleName, message, ...optionalParams) => { if (shouldLog(LOG_LEVELS.WARN)) { console.warn(formatMessage(LOG_LEVELS.WARN, moduleName, message, ...optionalParams)); } }, error: (moduleName, message, ...optionalParams) => { if (shouldLog(LOG_LEVELS.ERROR)) { console.error(formatMessage(LOG_LEVELS.ERROR, moduleName, message, ...optionalParams)); } }, fatal: (moduleName, message, ...optionalParams) => { // Fatal обычно означает, что приложение не может продолжать работу if (shouldLog(LOG_LEVELS.FATAL)) { console.error(formatMessage(LOG_LEVELS.FATAL, moduleName, message, ...optionalParams)); // В реальном приложении здесь может быть process.exit(1) после логирования } }, // Generic log function if needed, defaults to INFO log: (moduleName, message, ...optionalParams) => { logger.info(moduleName, message, ...optionalParams); } }; module.exports = logger; /* Пример использования в другом файле: const logger = require('../core/logger'); // Путь зависит от местоположения logger.info('GameManager', 'Новая игра создана', { gameId: '123', mode: 'pvp' }); logger.error('AuthService', 'Ошибка аутентификации пользователя', new Error('Пароль неверный')); logger.debug('GameInstance', 'Состояние игрока обновлено:', playerStateObject); */