Отказ от внутреннего типа данных LoggerMessage и переход на валидацию по схемам

This commit is contained in:
Mikhail Chechnev 2018-11-27 17:15:54 +03:00
parent 1444f33841
commit d20b136e7a
2 changed files with 137 additions and 91 deletions

View File

@ -8,106 +8,60 @@
//---------------------- //----------------------
const _ = require("lodash"); //Работа с массивами и объектами const _ = require("lodash"); //Работа с массивами и объектами
const db = require("../core/db_connector"); //Модуль взаимодействия с БД const { validateObject } = require("../core/utils"); //Вспомогательные функции
const db = require("./db_connector"); //Модуль взаимодействия с БД
const { NLOG_STATE_INF, NLOG_STATE_WRN, NLOG_STATE_ERR } = require("../models/obj_log"); //Схемы валидации записи журнала работы сервиса обмена
const prmsLoggerSchema = require("../models/prms_logger"); //Схемы валидации параметров функций модуля
//------------ //------------
// Тело модуля // Тело модуля
//------------ //------------
//Типы сообщений протокола
const SLOGGER_MESSAGE_TYPE_ERROR = "ERROR"; // Ошибка
const SLOGGER_MESSAGE_TYPE_WARN = "WARN"; // Предупреждение
const SLOGGER_MESSAGE_TYPE_INFO = "INFO"; // Информация
//Сообщение протокола
class LoggerMessage {
//Конструктор класса
constructor(sType, sMessage, prms) {
this.sType = sType;
this.sMessage = sMessage;
if (prms) {
this.nServiceId = prms.nServiceId;
this.nServiceFnId = prms.nServiceFnId;
this.nQueueId = prms.nQueueId;
}
}
}
//Класс управления протоколом //Класс управления протоколом
class Logger { class Logger {
//Конструктор класса //Конструктор класса
constructor() { constructor() {
this.dbConnector = ""; this.dbConnector = null;
this.bLogDB = false; this.bLogDB = false;
} }
//Включение/выключение записи протоколов в БД //Включение/выключение записи протоколов в БД
setLogDB(bLogDB) { setLogDB(bLogDB) {
this.bLogDB = bLogDB; if (this.dbConnector) this.bLogDB = bLogDB;
} }
//Установка объекта для протоколирования в БД //Установка объекта для протоколирования в БД
setDBConnector(dbConnector) { setDBConnector(dbConnector, bLogDB) {
if (dbConnector instanceof db.DBConnector) { if (dbConnector instanceof db.DBConnector) {
this.dbConnector = dbConnector; this.dbConnector = dbConnector;
this.bLogDB = true; if (bLogDB === true) this.setLogDB(true);
else this.setLogDB(false);
} }
} }
//Удаление объекта для протоколирования в БД //Удаление объекта для протоколирования в БД
removeDBConnector() { removeDBConnector() {
this.dbConnector = ""; this.dbConnector = null;
this.bLogDB = false; this.setLogDB(false);
}
//Протоколирование в БД
async logToDB(loggerMessage) {
//Если надо протоколировать и есть чем
if (this.bLogDB && this.dbConnector && this.dbConnector.bConnected) {
//Если протоколируем стандартное сообщение
if (loggerMessage instanceof LoggerMessage) {
//Подготовим доп. сведения для протокола
let logData = {};
_.extend(logData, loggerMessage);
//Анализируем тип сообщения
switch (loggerMessage.sType) {
case SLOGGER_MESSAGE_TYPE_ERROR: {
await this.dbConnector.putLogErr(loggerMessage.sMessage, logData);
break;
}
case SLOGGER_MESSAGE_TYPE_WARN: {
await this.dbConnector.putLogWrn(loggerMessage.sMessage, logData);
break;
}
case SLOGGER_MESSAGE_TYPE_INFO: {
await this.dbConnector.putLogInf(loggerMessage.sMessage, logData);
break;
}
default:
await this.dbConnector.putLogInf(loggerMessage.sMessage, logData);
break;
}
} else {
//Для нестандартных - есдиный способ протоколирования
await this.dbConnector.putLogInf(loggerMessage);
}
}
} }
//Протоколирование //Протоколирование
async log(loggerMessage) { async log(prms) {
let sMessage = ""; //Проверяем структуру переданного объекта для подключения
let sPrefix = "LOG MESSAGE"; let sCheckResult = validateObject(prms, prmsLoggerSchema.log, "Параметры функции протоколирования");
let sColorPattern = ""; //Если структура объекта в норме
//Конструируем сообщение if (!sCheckResult) {
if (loggerMessage instanceof LoggerMessage) { //Определим оформление сообщения
switch (loggerMessage.sType) { let sPrefix = "ИНФОРМАЦИЯ";
case SLOGGER_MESSAGE_TYPE_ERROR: { let sColorPattern = "";
switch (prms.nLogState) {
case NLOG_STATE_ERR: {
sPrefix = "ОШИБКА"; sPrefix = "ОШИБКА";
sColorPattern = "\x1b[31m%s\x1b[0m%s"; sColorPattern = "\x1b[31m%s\x1b[0m%s";
break; break;
} }
case SLOGGER_MESSAGE_TYPE_WARN: { case NLOG_STATE_WRN: {
sPrefix = "ПРЕДУПРЕЖДЕНИЕ"; sPrefix = "ПРЕДУПРЕЖДЕНИЕ";
sColorPattern = "\x1b[33m%s\x1b[0m%s"; sColorPattern = "\x1b[33m%s\x1b[0m%s";
break; break;
} }
case SLOGGER_MESSAGE_TYPE_INFO: { case NLOG_STATE_INF: {
sPrefix = "ИНФОРМАЦИЯ"; sPrefix = "ИНФОРМАЦИЯ";
sColorPattern = "\x1b[32m%s\x1b[0m%s"; sColorPattern = "\x1b[32m%s\x1b[0m%s";
break; break;
@ -115,31 +69,56 @@ class Logger {
default: default:
break; break;
} }
sMessage = loggerMessage.sMessage; //Выдаём сообщение
} else { console.log(sColorPattern, sPrefix + ": ", prms.sMsg);
sMessage = loggerMessage; //Протоколируем в БД, если это необходимо
} if (this.bLogDB) {
//Выдаём сообщение try {
console.log(sColorPattern, sPrefix + ": ", sMessage); //Если есть чем протоколировать
//Протоколируем в БД, если это необходимо if (this.dbConnector && this.dbConnector.bConnected) {
if (this.bLogDB) await this.dbConnector.putLog(prms);
try { }
await this.logToDB(loggerMessage); } catch (e) {
} catch (e) { console.log("\x1b[31m%s\x1b[0m%s", "ОШИБКА ПРОТОКОЛИРОВАНИЯ: ", e.sMessage);
console.log("LOGGER ERROR: " + e.sMessage); }
} }
} else {
console.log("\x1b[31m%s\x1b[0m%s", "ОШИБКА ПРОТОКОЛИРОВАНИЯ: ", sCheckResult);
console.log(prms);
}
} }
//Протоколирование ошибки //Протоколирование ошибки
async error(sMsg) { async error(sMsg, prms) {
await this.log(new LoggerMessage(SLOGGER_MESSAGE_TYPE_ERROR, sMsg)); //Подготовим параметры для протоколирования
let logData = {};
if (prms) logData = _.cloneDeep(prms);
//Выставим сообщение и тип записи журнала
logData.nLogState = NLOG_STATE_ERR;
logData.sMsg = sMsg;
//Протоколируем
await this.log(logData);
} }
//Протоколирование предупреждения //Протоколирование предупреждения
async warn(sMsg) { async warn(sMsg, prms) {
await this.log(new LoggerMessage(SLOGGER_MESSAGE_TYPE_WARN, sMsg)); //Подготовим параметры для протоколирования
let logData = {};
if (prms) logData = _.cloneDeep(prms);
//Выставим сообщение и тип записи журнала
logData.nLogState = NLOG_STATE_WRN;
logData.sMsg = sMsg;
//Протоколируем
await this.log(logData);
} }
//Протоколирование информации //Протоколирование информации
async info(sMsg) { async info(sMsg, prms) {
await this.log(new LoggerMessage(SLOGGER_MESSAGE_TYPE_INFO, sMsg)); //Подготовим параметры для протоколирования
let logData = {};
if (prms) logData = _.cloneDeep(prms);
//Выставим сообщение и тип записи журнала
logData.nLogState = NLOG_STATE_INF;
logData.sMsg = sMsg;
//Протоколируем
await this.log(logData);
} }
} }
@ -147,8 +126,4 @@ class Logger {
// Интерфейс модуля // Интерфейс модуля
//----------------- //-----------------
exports.SLOGGER_MESSAGE_TYPE_ERROR = SLOGGER_MESSAGE_TYPE_ERROR;
exports.SLOGGER_MESSAGE_TYPE_WARN = SLOGGER_MESSAGE_TYPE_WARN;
exports.SLOGGER_MESSAGE_TYPE_INFO = SLOGGER_MESSAGE_TYPE_INFO;
exports.LoggerMessage = LoggerMessage;
exports.Logger = Logger; exports.Logger = Logger;

71
models/prms_logger.js Normal file
View File

@ -0,0 +1,71 @@
/*
Сервис интеграции ПП Парус 8 с WEB API
Модели данных: описатели параметров процедур модуля протоколирования работы (класс Logger)
*/
//----------------------
// Подключение библиотек
//----------------------
const Schema = require("validate"); //Схемы валидации
const { NLOG_STATE_INF, NLOG_STATE_WRN, NLOG_STATE_ERR } = require("./obj_log"); //Схемы валидации записи журнала работы сервиса обмена
//------------------
// Интерфейс модуля
//------------------
//Схема валидации параметров функции записи в журнал работы сервиса
exports.log = new Schema({
//Тип сообщения журнала работы сервиса
nLogState: {
type: Number,
enum: [NLOG_STATE_INF, NLOG_STATE_WRN, NLOG_STATE_ERR],
required: true,
message: {
type: "Тип сообщения журнала работы сервиса (nLogState) имеет некорректный тип данных (ожидалось - Number)",
enum: "Значение типа сообщения журнала работы сервиса (nLogState) не поддерживается",
required: "Не указан тип сообщения журнала работы сервиса (nLogState)"
}
},
//Сообщение журнала работы сервиса
sMsg: {
type: String,
required: true,
message: {
type: "Сообщение журнала работы сервиса (sMsg) имеет некорректный тип данных (ожидалось - String)",
required: "Не указано сообщение журнала работы сервиса (sMsg)"
}
},
//Идентификатор связанного сервиса
nServiceId: {
type: Number,
required: false,
message: {
type:
"Идентификатор связанного сервиса сообщения журнала работы сервиса (nServiceId) имеет некорректный тип данных (ожидалось - Number)",
required: "Не указан идентификатор связанного сервиса сообщения журнала работы сервиса (nServiceId)"
}
},
//Идентификатор связанной функции-обработчика сервиса
nServiceFnId: {
type: Number,
required: false,
message: {
type:
"Идентификатор связанной функции-обработчика сообщения журнала работы сервиса (nServiceFnId) имеет некорректный тип данных (ожидалось - Number)",
required:
"Не указан идентификатор связанной функции-обработчика сообщения журнала работы сервиса (nServiceFnId)"
}
},
//Идентификатор связанной позиции очереди обмена
nQueueId: {
type: Number,
required: false,
message: {
type:
"Идентификатор связанной позиции очереди обмена сообщения журнала работы сервиса (nQueueId) имеет некорректный тип данных (ожидалось - Number)",
required:
"Не указан идентификатор связанной позиции очереди обмена сообщения журнала работы сервиса (nQueueId)"
}
}
});