Some checks failed
Deploy Project BC / deploy (push) Failing after 33s
93 lines
3.7 KiB
JavaScript
93 lines
3.7 KiB
JavaScript
// /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);
|
||
*/ |