bc/server/core/logger.js

93 lines
3.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// /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);
*/