swaf/dist/Logger.js

111 lines
14 KiB
JavaScript

import config from "config";
import { v4 as uuid } from "uuid";
import Log from "./models/Log";
const LOG_LEVEL = config.get('log_level');
const DB_LOG_LEVEL = config.get('db_log_level');
export default class Logger {
static silentError(error, ...message) {
return this.log('ERROR', message, error, true) || '';
}
static error(error, ...message) {
return this.log('ERROR', message, error) || '';
}
static warn(...message) {
this.log('WARN', message);
}
static info(...message) {
this.log('INFO', message);
}
static debug(...message) {
this.log('DEBUG', message);
}
static dev(...message) {
this.log('DEV', message);
}
static log(level, message, error, silent = false) {
const levelIndex = LogLevel[level];
if (levelIndex <= LogLevel[LOG_LEVEL]) {
if (error) {
if (levelIndex > LogLevel.ERROR)
this.warn(`Wrong log level ${level} with attached error.`);
}
else {
if (levelIndex <= LogLevel.ERROR)
this.warn(`No error attached with log level ${level}.`);
}
const computedMsg = message.map(v => {
if (typeof v === 'string') {
return v;
}
else {
return JSON.stringify(v, (key, value) => {
if (value instanceof Object) {
if (value.type === 'Buffer') {
return `Buffer<${Buffer.from(value.data).toString('hex')}>`;
}
else if (value !== v) {
return `[object Object]`;
}
}
if (typeof value === 'string' && value.length > 96) {
return value.substr(0, 96) + '...';
}
return value;
}, 4);
}
}).join(' ');
const log = new Log({});
log.setLevel(level);
log.message = computedMsg;
log.setError(error);
let logID = Buffer.alloc(16);
uuid({}, logID);
log.setLogID(logID);
let output = `[${level}] `;
let pad = output.length;
if (levelIndex <= LogLevel[DB_LOG_LEVEL])
output += `${log.getLogID()} - `;
output += computedMsg.replace(/\n/g, '\n' + ' '.repeat(pad));
switch (level) {
case "ERROR":
if (silent || !error) {
console.error(output);
}
else {
console.error(output, error);
}
break;
case "WARN":
console.warn(output);
break;
case "INFO":
console.info(output);
break;
case "DEBUG":
case "DEV":
console.debug(output);
break;
}
if (levelIndex <= LogLevel[DB_LOG_LEVEL]) {
log.save().catch(err => {
if (!silent && err.message.indexOf('ECONNREFUSED') < 0) {
console.error({ save_err: err, error });
}
});
}
return log.getLogID();
}
return null;
}
constructor() {
}
}
export var LogLevel;
(function (LogLevel) {
LogLevel[LogLevel["ERROR"] = 0] = "ERROR";
LogLevel[LogLevel["WARN"] = 1] = "WARN";
LogLevel[LogLevel["INFO"] = 2] = "INFO";
LogLevel[LogLevel["DEBUG"] = 3] = "DEBUG";
LogLevel[LogLevel["DEV"] = 4] = "DEV";
})(LogLevel || (LogLevel = {}));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nZ2VyLmpzIiwic291cmNlUm9vdCI6Ii4vIiwic291cmNlcyI6WyJMb2dnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxFQUFFLElBQUksSUFBSSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ2hDLE9BQU8sR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUUvQixNQUFNLFNBQVMsR0FBK0IsTUFBTSxDQUFDLEdBQUcsQ0FBUyxXQUFXLENBQUMsQ0FBQztBQUM5RSxNQUFNLFlBQVksR0FBK0IsTUFBTSxDQUFDLEdBQUcsQ0FBUyxjQUFjLENBQUMsQ0FBQztBQUVwRixNQUFNLENBQUMsT0FBTyxPQUFPLE1BQU07SUFDaEIsTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFZLEVBQUUsR0FBRyxPQUFjO1FBQ3JELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDekQsQ0FBQztJQUVNLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBWSxFQUFFLEdBQUcsT0FBYztRQUMvQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDbkQsQ0FBQztJQUVNLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFjO1FBQ2hDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFTSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBYztRQUNoQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQWM7UUFDakMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxD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UUFBUSxLQUFSLFFBQVEsUUFNbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY29uZmlnIGZyb20gXCJjb25maWdcIjtcbmltcG9ydCB7djQgYXMgdXVpZH0gZnJvbSBcInV1aWRcIjtcbmltcG9ydCBMb2cgZnJvbSBcIi4vbW9kZWxzL0xvZ1wiO1xuXG5jb25zdCBMT0dfTEVWRUw6IExvZ0xldmVsS2V5cyA9IDxMb2dMZXZlbEtleXM+Y29uZmlnLmdldDxzdHJpbmc+KCdsb2dfbGV2ZWwnKTtcbmNvbnN0IERCX0xPR19MRVZFTDogTG9nTGV2ZWxLZXlzID0gPExvZ0xldmVsS2V5cz5jb25maWcuZ2V0PHN0cmluZz4oJ2RiX2xvZ19sZXZlbCcpO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMb2dnZXIge1xuICAgIHB1YmxpYyBzdGF0aWMgc2lsZW50RXJyb3IoZXJyb3I6IEVycm9yLCAuLi5tZXNzYWdlOiBhbnlbXSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvZygnRVJST1InLCBtZXNzYWdlLCBlcnJvciwgdHJ1ZSkgfHwgJyc7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBlcnJvcihlcnJvcjogRXJyb3IsIC4uLm1lc3NhZ2U6IGFueVtdKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9nKCdFUlJPUicsIG1lc3NhZ2UsIGVycm9yKSB8fCAnJztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHdhcm4oLi4ubWVzc2FnZTogYW55W10pIHtcbiAgICAgICAgdGhpcy5sb2coJ1dBUk4nLCBtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGluZm8oLi4ubWVzc2FnZTogYW55W10pIHtcbiAgICAgICAgdGhpcy5sb2coJ0lORk8nLCBtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlYnVnKC4uLm1lc3NhZ2U6IGFueVtdKSB7XG4gICAgICAgIHRoaXMubG9nKCdERUJVRycsIG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGV2KC4uLm1lc3NhZ2U6IGFueVtdKSB7XG4gICAgICAgIHRoaXMubG9nKCdERVYnLCBtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBsb2cobGV2ZWw6IExvZ0xldmVsS2V5cywgbWVzc2FnZTogYW55W10sIGVycm9yPzogRXJyb3IsIHNpbGVudDogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGxldmVsSW5kZXggPSBMb2dMZXZlbFtsZXZlbF07XG4gICAgICAgIGlmIChsZXZlbEluZGV4IDw9IExvZ0xldmVsW0xPR19MRVZFTF0pIHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChsZXZlbEluZGV4ID4gTG9nTGV2ZWwuRVJST1IpIHRoaXMud2FybihgV3JvbmcgbG9nIGxldmVsICR7bGV2ZWx9IHdpdGggYXR0YWNoZWQgZXJyb3IuYCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChsZXZlbEluZGV4IDw9IExvZ0xldmVsLkVSUk9SKSB0aGlzLndhcm4oYE5vIGVycm9yIGF0dGFjaGVkIHdpdGggbG9nIGxldmVsICR7bGV2ZWx9LmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb21wdXRlZE1zZyA9IG1lc3NhZ2UubWFwKHYgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHYsIChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnR5cGUgPT09ICdCdWZmZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgQnVmZmVyPCR7QnVmZmVyLmZyb20odmFsdWUuZGF0YSkudG9TdHJpbmcoJ2hleCcpfT5gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT09IHYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbb2JqZWN0IE9iamVjdF1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA+IDk2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnN1YnN0cigwLCA5NikgKyAnLi4uJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSwgNCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkuam9pbignICcpO1xuXG4gICAgICAgICAgICBjb25zdCBsb2cgPSBuZXcgTG9nKHt9KTtcbiAgICAgICAgICAgIGxvZy5zZXRMZXZlbChsZXZlbCk7XG4gICAgICAgICAgICBsb2cubWVzc2FnZSA9IGNvbXB1dGVkTXNnO1xuICAgICAgICAgICAgbG9nLnNldEVycm9yKGVycm9yKTtcblxuICAgICAgICAgICAgbGV0IGxvZ0lEID0gQnVmZmVyLmFsbG9jKDE2KTtcbiAgICAgICAgICAgIHV1aWQoe30sIGxvZ0lEKTtcbiAgICAgICAgICAgIGxvZy5zZXRMb2dJRChsb2dJRCk7XG5cblxuICAgICAgICAgICAgbGV0IG91dHB1dCA9IGBbJHtsZXZlbH1dIGA7XG4gICAgICAgICAgICBsZXQgcGFkID0gb3V0cHV0Lmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChsZXZlbEluZGV4IDw9IExvZ0xldmVsW0RCX0xPR19MRVZFTF0pIG91dHB1dCArPSBgJHtsb2cuZ2V0TG9nSUQoKX0gLSBgO1xuICAgICAgICAgICAgb3V0cHV0ICs9IGNvbXB1dGVkTXNnLnJlcGxhY2UoL1xcbi9nLCAnXFxuJyArICcgJy5yZXBlYXQocGFkKSk7XG5cbiAgICAgICAgICAgIHN3aXRjaCAobGV2ZWwpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiRVJST1JcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNpbGVudCB8fCAhZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3Iob3V0cHV0KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3Iob3V0cHV0LCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIldBUk5cIjpcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKG91dHB1dCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJJTkZPXCI6XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhvdXRwdXQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiREVCVUdcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiREVWXCI6XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcob3V0cHV0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChsZXZlbEluZGV4IDw9IExvZ0xldmVsW0RCX0xPR19MRVZFTF0pIHtcbiAgICAgICAgICAgICAgICBsb2cuc2F2ZSgpLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc2lsZW50ICYmIGVyci5tZXNzYWdlLmluZGV4T2YoJ0VDT05OUkVGVVNFRCcpIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcih7c2F2ZV9lcnI6IGVyciwgZXJyb3J9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGxvZy5nZXRMb2dJRCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgfVxufVxuXG5leHBvcnQgZW51bSBMb2dMZXZlbCB7XG4gICAgRVJST1IsXG4gICAgV0FSTixcbiAgICBJTkZPLFxuICAgIERFQlVHLFxuICAgIERFVixcbn1cblxuZXhwb3J0IHR5cGUgTG9nTGV2ZWxLZXlzID0ga2V5b2YgdHlwZW9mIExvZ0xldmVsO1xuIl19