UNPKG

vitis-engine-lib

Version:

Lib used on Vitis engines

270 lines 9.12 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const fs_1 = __importDefault(require("fs")); const os_1 = __importDefault(require("os")); const path_1 = __importDefault(require("path")); const moment_1 = __importDefault(require("moment")); /** * Class logger * Permet de logger dans les différents fichiers */ class Logger { /** * Constructeur * @param properties */ constructor(properties) { // Dossier de logs this.logFolder_ = 'log'; // chemin vers le fichier de log this.logFullPath_ = []; // Niveaux de log this.appLogLevel = 'INFO'; this.aLogLevels_ = [ 'DEBUG', 'INFO', 'NOTICE', 'WARNING', 'ERROR', 'CRITICAL', 'ALERT', 'EMERGENCY', ]; this.pid_ = 0; this.allow_console_return = true; // Properties this.properties_ = properties; // Niveau de log if (this.properties_.log_level) { this.appLogLevel = this.properties_.log_level; } else { this.appLogLevel = 'DEBUG'; } this.logFolder_ = this.properties_.log_dir; this.pid_ = process.pid; this.logFullPath_ = this.getLogFilePath_(); } /** * Set moteur pour l'utiliser dans les logs * @param {any} engine engine_id */ setEngine(engine) { this.engine_ = engine; // on met à jour le chemin this.logFullPath_ = this.getLogFilePath_(); } /** * Set le chemin vers le fichier e log à utiliser * @param {string} sPath chemin à utiliser pour logger */ setLogFilePath(sPath) { // Conversion du format de date de php vers js const sFormat = this.getDateFormat(); const sLogDate = this.getFormatedDate_(new Date(), sFormat); sPath = sPath.replace(/@date/, sLogDate); // on met à jour le chemin this.logFullPath_ = sPath.split('/'); } /** * * @returns {string} */ getDateFormat() { let sFormat = this.properties_.log_period; sFormat = sFormat.replace('Y', 'YYYY'); sFormat = sFormat.replace('m', 'MM'); sFormat = sFormat.replace('d', 'DD'); return sFormat; } /** * désactive les console.log du logger */ disableConsoleMessage() { this.allow_console_return = false; } /** * active les console.log du logger */ enableConsoleMessage() { this.allow_console_return = true; } /** * Écrit un message dans le logs * @param {string} message * @param {*} variable variable à logger dans le message * @param {string|undefined} level */ log(message, variable, level = 'INFO') { // si le message est manquant on a rien à log if (!message) { return; } if (this.allow_console_return) { // envoi du log dans la console if (variable) { console.log(message, variable); } else { console.log(message); } } // récupération des niveaux de log disponibles const appLogLevels = this.getAppLogLevels_(); // si le niveau n'est pas disponible rien à logger if (appLogLevels.indexOf(level) === -1) { return; } // formattage du message message = this.getFormatedMessage_(message, variable, level); // Chemin vers le fichier const aFilePath = this.logFullPath_; const sFilePath = this.logFullPath_.join('/'); // analyse de la taille du fichier pour chunk si besoin if (fs_1.default.existsSync(sFilePath)) { // taille du fichier de log en octet const stats = fs_1.default.statSync(sFilePath); const iLogFileSize = stats["size"]; // taille du message en octet const iMessageSize = Buffer.byteLength(message, 'utf8'); const iFinalSize = iLogFileSize + iMessageSize; if ((this.properties_.log_size - 1) <= iFinalSize) { try { this.chunkLogFile(aFilePath); } catch (error) { console.log('could not rename log file', error); return; } } } try { // Crée le fichier de log si il n'existe pas this.createLogFile_(aFilePath); } catch (error) { console.log('could not create log file', error); return; } // Écrit dans le fichier this.appendMessage_(sFilePath, message); } /** * Calcule le nouveau nom du fichier de log et renome l'ancien fichier * @param {string[]} aFilePath tableau chemin vers le fichier d'origine */ chunkLogFile(aFilePath) { // création d'une copie du tableau pour modification const aFinalFilePath = [...aFilePath]; // analyse du chemin pour modification du nom de chemin if (aFinalFilePath) { const sFileName = aFinalFilePath.pop(); if (typeof sFileName === 'string') { const sChunkedFileName = sFileName.replace('.log', '.' + this.getFormatedDate_(new Date(), 'YYYY_MM_DD_X') + '.log'); aFinalFilePath.push(sChunkedFileName); fs_1.default.renameSync(aFilePath.join('/'), aFinalFilePath.join('/')); } } } /** * Retourne les niveaux de logs disponibles selon la configuration utilisateur * @returns {Array} */ getAppLogLevels_() { // Filtrage en fonction du niveau de log const availableLogLevels = []; for (let i = this.aLogLevels_.length - 1; i >= 0; i--) { const logLevel = this.aLogLevels_[i]; availableLogLevels.push(logLevel); if (logLevel === this.appLogLevel) { break; } } return availableLogLevels; } /** * Retourne le chemin vers le fichier de log * @return {Array} chemin vers la fichier de log */ getLogFilePath_() { const path = [this.logFolder_]; const sFormat = this.getDateFormat(); path.push(this.getFormatedDate_(new Date(), sFormat)); path.push('engines'); if (this.properties_.use_hostname_in_logdir === true) { path.push(os_1.default.hostname()); } if (this.engine_ && this.engine_.gtf_engine_id) { path.push(`engine_${this.engine_.gtf_engine_id}`); } path.push('engine.log'); return path; } /** * Retourne la date formatée * @param {Date} d Date * @param {string | undefined} format https://momentjs.com/docs/#/displaying/format/ * @returns {string} formated date */ getFormatedDate_(d, format = 'YYYY/MM/DD') { const oDate = moment_1.default(d); return oDate.format(format); } /** * Crée le fichier de log si il n'existe pas * @param {Array} chemin vers le fichier */ createLogFile_(filePath) { const sFilePath = filePath.join('/'); const directory = path_1.default.dirname(sFilePath); const oldMask = process.umask(0); // Crée les sous dossiers si besoin fs_1.default.mkdirSync(directory, { recursive: true, mode: 0o777 }); // Crée le fichier si besoin if (!fs_1.default.existsSync(sFilePath)) { fs_1.default.writeFileSync(sFilePath, '', { encoding: 'utf8', mode: 0o766, }); } process.umask(oldMask); } /** * Écrit le message * @param {Array} filePath * @param {string} message message formatté */ appendMessage_(filePath, message) { if (filePath && message) { // Écrit le message fs_1.default.appendFileSync(filePath, message); } } /** * écrit un message dans un fichier de log * @param {string} message message à logger * @param {any} variable variable à associé au message * @param {string} level Niveau de log */ getFormatedMessage_(message, variable, level = 'INFO') { let formattedMessage = `${this.getFormatedDate_(new Date(), 'DD-MM-YYYY HH:mm:ss')}`; formattedMessage += ` | ${this.pid_}`; formattedMessage += ` | ${level}`; formattedMessage += ` | ${message}`; if (variable) { try { formattedMessage += ` ${JSON.stringify(variable)}`; } catch (error) { formattedMessage += ` ${String(variable)}`; } } formattedMessage += `\n`; return formattedMessage; } } exports.default = Logger; //# sourceMappingURL=logger.js.map