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

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)"
}
}
});