roar-sdk
Version:
Node.js SDK for developing Roar inspectors
335 lines (278 loc) • 9.21 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.LEVELS = undefined;
var _stringify = require('babel-runtime/core-js/json/stringify');
var _stringify2 = _interopRequireDefault(_stringify);
var _assign = require('babel-runtime/core-js/object/assign');
var _assign2 = _interopRequireDefault(_assign);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _fs = require('fs');
var _fs2 = _interopRequireDefault(_fs);
var _microprofiler = require('microprofiler');
var _microprofiler2 = _interopRequireDefault(_microprofiler);
var _os = require('os');
var _os2 = _interopRequireDefault(_os);
var _requestretry = require('requestretry');
var _requestretry2 = _interopRequireDefault(_requestretry);
var _configure = require('../configure');
var _configure2 = _interopRequireDefault(_configure);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// ASCII ESCAPE SEQUENCE http://www5c.biglobe.ne.jp/~ecb/assembler2/b_2.html
var levelToColor = {
'6': '[N]', // no color
v: '[35m[V]', // purple
d: '[34m[D]', // blue
w: '[33m[W]', // yellow
'1': '[31m[E]' // red
};
// --- Modules
// --- Libraries
var LEVELS = exports.LEVELS = {
'ERROR': 0,
'WARNING': 1,
'INFO': 2,
'DEBUG': 3
};
var LEVEL_COLORS = {
'DEBUG': '[35m[V]', // purple
'INFO': '[34m[D]', // blue
'WARNING': '[33m[W]', // yellow
'ERROR': '[31m[E]' // red
};
function getFormattedDate() {
var d = new Date();
var month = d.getMonth() + 1;
if (month < 10) month = '0' + month;
var date = d.getDate();
if (date < 10) date = '0' + date;
var hour = d.getHours();
if (hour < 10) hour = '0' + hour;
var minutes = d.getMinutes();
if (minutes < 10) minutes = '0' + minutes;
var sec = d.getSeconds();
if (sec < 10) sec = '0' + sec;
return d.getFullYear() + '-' + month + '-' + date + 'T' + hour + ':' + minutes + ':' + sec + '.' + d.getMilliseconds() + 'Z';
}
/**
* Logger for use with roar-sdk
*
* format:
* ``[LogLevel] [Time] [File] log text``
*
* log levels:
* - verbose
* - debug
* - info
* - warning
* - error
*
* @example
* import { Logger } from 'roar-sdk'
*
* // simple usage
* Logger.verbose('verbose log');
*
*/
var Logger = function () {
function Logger() {
(0, _classCallCheck3.default)(this, Logger);
this.profiles = {};
}
/**
* Get log information.
* @return {String} Info string containing the file name and line number.
* @private
*/
(0, _createClass3.default)(Logger, [{
key: 'getInfo',
value: function getInfo() {
var info = void 0;
try {
throw new Error();
} catch (e) {
var lines = e.stack.split('\n');
var line = lines[4];
var matched = line.match(/([\w\d\-_.]*:\d+:\d+)/);
info = matched[1];
}
return info;
}
}, {
key: 'log',
value: function log(uid, key, options, cb) {
//level, msg, status) {
var info = this.getInfo();
if (process.env.NODE_ENV === 'dev' || process.env.NODE_ENV === 'test') {
var color = LEVEL_COLORS['' + (options.level || 'INFO')];
var log = color + ' [' + _configure2.default.version + '] [' + getFormattedDate() + '] [' + info + '] ' + (options.msg || '') + '\x1B[0m';
console.log(log);
} else {
(0, _requestretry2.default)({
method: 'POST',
url: _configure2.default.apiURL() + '/job/' + uid,
json: true,
body: options,
gzip: true,
maxAttempts: 1, // (default) try 5 times
retryDelay: 20000, // (default) wait for 20s before trying again
retryStrategy: _requestretry2.default.RetryStrategies.HTTPOrNetworkError, // (default) retry on 5xx or network errors
headers: {
'Authorization': key,
'Accept': 'application/json'
}
}, function (error, response, body) {
if (error) {
console.error('[WARN] [' + _configure2.default.version + '] [' + new Date().toLocaleString() + '] [' + info + '] Failed to send log messge to Roar API', error);
}
if (cb) {
cb();
}
});
}
}
/**
* Displays the log
* @param {String} level The log level, v, d, i, w, e
* @param {...*} msg The message to log
* @returns {String} The formatted log message.
* @private
*/
}, {
key: 'output',
value: function output(level, msg, details, msgCode, extra) {
var info = this.getInfo();
if (process.env.NODE_ENV === 'dev' || process.env.NODE_ENV === 'test') {
var color = levelToColor['' + level];
var log = color + ' [' + _configure2.default.version + '] [' + getFormattedDate() + '] [' + info + '] ' + (details || '') + '\x1B[0m';
console.log(log);
} else {
var _log = {
'version': _configure2.default.version,
'host': require('os').hostname(),
'short_message': msg,
'full_message': details || '',
'timestamp': new Date().getTime() / 1000,
'level': level,
'facility': 'roar-agent',
'file': info ? info[0] : 'N/A',
'line': info ? info[1] : 'N/A',
'_msgCode': msgCode
};
if (extra) {
_log = (0, _assign2.default)(_log, extra);
}
(0, _requestretry2.default)({
method: 'POST',
url: _configure2.default.apiURL() + '/sdk/log',
json: true,
body: _log,
gzip: true,
maxAttempts: 1, // (default) try 5 times
retryDelay: 20000, // (default) wait for 20s before trying again
retryStrategy: _requestretry2.default.RetryStrategies.HTTPOrNetworkError, // (default) retry on 5xx or network errors
headers: {
'Authorization': global.ACCESS_KEY,
'Accept': 'application/json'
}
}, function (error, response, body) {
_fs2.default.appendFileSync('./scanners.log', (0, _stringify2.default)(_log));
if (error) {
console.error('[WARN] [' + _configure2.default.version + '] [' + getFormattedDate() + '] [' + info + '] Failed to send log messge to Roar API', error);
}
});
}
}
/**
* Logs a verbose message
* @param {...*} msg Message to log
* @returns {string} Formatted log message.
*/
}, {
key: 'verbose',
value: function verbose() {
for (var _len = arguments.length, msg = Array(_len), _key = 0; _key < _len; _key++) {
msg[_key] = arguments[_key];
}
return this.output.apply(this, ['v'].concat(msg));
}
/**
* Logs a debug message
* @param {...*} msg Message to log
* @returns {string} Formatted log message.
*/
}, {
key: 'debug',
value: function debug() {
for (var _len2 = arguments.length, msg = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
msg[_key2] = arguments[_key2];
}
return this.output.apply(this, ['d'].concat(msg));
}
/**
* Logs an informative message
* @param {...*} msg Message to log
* @returns {string} Formatted log message.
*/
}, {
key: 'info',
value: function info() {
for (var _len3 = arguments.length, msg = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
msg[_key3] = arguments[_key3];
}
return this.output.apply(this, ['i'].concat(msg));
}
/**
* Logs a warning message
* @param {...*} msg Message to log
* @returns {string} Formatted log message.
*/
}, {
key: 'warn',
value: function warn() {
for (var _len4 = arguments.length, msg = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
msg[_key4] = arguments[_key4];
}
return this.output.apply(this, ['w'].concat(msg));
}
/**
* Logs an error message
* @param {...*} msg Message to log
* @returns {string} Formatted log message.
*/
}, {
key: 'error',
value: function error() {
for (var _len5 = arguments.length, msg = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
msg[_key5] = arguments[_key5];
}
return this.output.apply(this, ['e'].concat(msg));
}
/**
* Starts profiling the code block to follow
* @param {String} tag Tag to identify the code block by
*/
}, {
key: 'startProfile',
value: function startProfile(tag) {
this.profiles[tag] = _microprofiler2.default.start();
}
/**
* Ends profiling the previous code block
* @param {String} tag Tag to identify the code block to stop profiling
*/
}, {
key: 'endProfile',
value: function endProfile(tag) {
_microprofiler2.default.measureFrom(this.profiles[tag], tag);
}
}]);
return Logger;
}();
var logger = new Logger();
exports.default = logger; // our default logger
//# sourceMappingURL=Logger.js.map