backendless
Version:
Backendless JavaScript SDK for Node.js and the browser
209 lines (208 loc) • 7.01 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _logger = _interopRequireDefault(require("./logger"));
var GLOBAL_LOGGER_NAME = 'Global logger';
var Logging = /*#__PURE__*/function () {
function Logging(app) {
(0, _classCallCheck2["default"])(this, Logging);
this.app = app;
this.reset();
if (app.loggingConfig) {
this.setConfig(app.loggingConfig);
}
}
(0, _createClass2["default"])(Logging, [{
key: "setConfig",
value: function setConfig(config) {
if (config.levels) {
this.levels = config.levels;
}
if (config.globalLevel) {
this.globalLevel = config.globalLevel;
}
if (config.loadLevels) {
this.loadLoggingLevels();
}
}
}, {
key: "reset",
value: function reset() {
this.levels = {};
this.globalLevel = 'all';
this.loggers = {};
this.messages = [];
this.numOfMessages = 10;
this.timeFrequency = 1;
this.messagesLimit = 1000;
}
}, {
key: "loadLoggingLevels",
value: function loadLoggingLevels() {
var _this = this;
this.app.appInfoPromise().then(function (appInfo) {
var loggersList = appInfo.loggers;
var loggers = {};
loggersList.forEach(function (logger) {
loggers[logger.name] = logger.level;
});
var globalLevel = loggers[GLOBAL_LOGGER_NAME];
_this.setConfig({
loggers: loggers,
globalLevel: globalLevel
});
})["catch"](function (error) {
// eslint-disable-next-line no-console
console.error('Could not load logging levels: ', error);
});
}
}, {
key: "getLogger",
value: function getLogger(loggerName) {
if (!loggerName || typeof loggerName !== 'string') {
throw new Error('Logger Name must be provided and must be a string.');
}
if (!this.loggers[loggerName]) {
this.loggers[loggerName] = new _logger["default"](loggerName, this);
}
return this.loggers[loggerName];
}
}, {
key: "flush",
value: function () {
var _flush = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
var _this2 = this;
var messages;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
if (!this.flushRequest && this.messages.length) {
this.stopFlushInterval();
messages = (0, _toConsumableArray2["default"])(this.messages);
this.messages = [];
this.flushRequest = Promise.resolve().then(function () {
return _this2.app.request.put({
url: _this2.app.urls.logging(),
data: messages
})["catch"](function (error) {
_this2.messages = [].concat((0, _toConsumableArray2["default"])(messages), (0, _toConsumableArray2["default"])(_this2.messages));
_this2.checkMessagesLimit();
throw error;
});
})["finally"](function () {
return delete _this2.flushRequest;
});
}
return _context.abrupt("return", this.flushRequest);
case 2:
case "end":
return _context.stop();
}
}, _callee, this);
}));
function flush() {
return _flush.apply(this, arguments);
}
return flush;
}()
}, {
key: "push",
value: function push(logger, logLevel, message, exception) {
this.messages.push({
logger: logger,
message: convertMessageToString(message),
exception: exception,
'log-level': logLevel,
timestamp: Date.now()
});
this.checkMessagesLen();
}
}, {
key: "checkMessagesLen",
value: function checkMessagesLen() {
var _this3 = this;
if (this.checkMessagesLenTimer) {
clearTimeout(this.checkMessagesLenTimer);
}
this.checkMessagesLenTimer = setTimeout(function () {
if (_this3.messages.length >= _this3.numOfMessages) {
_this3.flush()["catch"](function (error) {
// eslint-disable-next-line no-console
console.error('Could not flush log messages immediately: ', error);
});
} else {
_this3.startFlushInterval();
}
}, 0);
}
}, {
key: "checkMessagesLimit",
value: function checkMessagesLimit() {
if (this.messages.length > this.messagesLimit) {
this.messages = this.messages.slice(this.messages.length - this.messagesLimit);
}
}
}, {
key: "startFlushInterval",
value: function startFlushInterval() {
var _this4 = this;
if (!this.flushInterval) {
this.flushInterval = setTimeout(function () {
_this4.flush()["catch"](function (error) {
// eslint-disable-next-line no-console
console.error('Could not flush log messages with timer: ', error);
});
}, this.timeFrequency * 1000);
}
}
}, {
key: "stopFlushInterval",
value: function stopFlushInterval() {
if (this.flushInterval) {
clearTimeout(this.flushInterval);
delete this.flushInterval;
}
}
}, {
key: "setLogReportingPolicy",
value: function setLogReportingPolicy(numOfMessages, timeFrequency) {
if (timeFrequency !== undefined && this.timeFrequency !== timeFrequency) {
this.stopFlushInterval();
}
if (numOfMessages > this.messagesLimit) {
this.messagesLimit = numOfMessages;
}
this.numOfMessages = numOfMessages;
this.timeFrequency = timeFrequency;
this.checkMessagesLen();
}
}, {
key: "setMessagesLimit",
value: function setMessagesLimit(messagesLimit) {
this.messagesLimit = messagesLimit;
this.checkMessagesLimit();
}
}]);
return Logging;
}();
exports["default"] = Logging;
function convertMessageToString(message) {
if (typeof message === 'string') {
return message;
}
if (typeof message === 'undefined') {
return 'undefined';
}
if (typeof message === 'function') {
return Object.prototype.toString.call(message);
}
return JSON.stringify(message);
}