1 | ;
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 | exports.default = void 0;
|
7 |
|
8 | var _jsonStringifySafe = _interopRequireDefault(require("json-stringify-safe"));
|
9 |
|
10 | var _lodash = _interopRequireDefault(require("lodash"));
|
11 |
|
12 | var _httpUtils = require("./httpUtils");
|
13 |
|
14 | var _stringUtils = require("./stringUtils");
|
15 |
|
16 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
17 |
|
18 | function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
|
19 |
|
20 | function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
21 |
|
22 | function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
23 |
|
24 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
25 |
|
26 | const LOG_FLUSH_INTERVAL_MS = 5 * 1000;
|
27 |
|
28 | class S3Logger {
|
29 | constructor(options) {
|
30 | _defineProperty(this, "_logObjects", []);
|
31 |
|
32 | _defineProperty(this, "_logRecordNum", 0);
|
33 |
|
34 | _defineProperty(this, "_options", void 0);
|
35 |
|
36 | _defineProperty(this, "queueLogRecord", logObj => {
|
37 | try {
|
38 | const nowMS = Date.now();
|
39 |
|
40 | let {
|
41 | data,
|
42 | message
|
43 | } = logObj,
|
44 | restLogObj = _objectWithoutProperties(logObj, ["data", "message"]);
|
45 |
|
46 | const objToPush = _objectSpread({
|
47 | event: message
|
48 | }, restLogObj, {
|
49 | record_num: ++this._logRecordNum,
|
50 | time_ms: nowMS,
|
51 | time_ts: new Date(nowMS).toISOString()
|
52 | });
|
53 |
|
54 | if (data != null) {
|
55 | // make sure data is a object
|
56 | if (typeof data !== 'object') {
|
57 | data = {
|
58 | value: data.toString()
|
59 | };
|
60 | } // promote data fields
|
61 |
|
62 |
|
63 | if (this._options.dataFieldsToPromote) {
|
64 | Object.entries(this._options.dataFieldsToPromote).forEach(([logProp, dataPath]) => {
|
65 | // $FlowIgnore
|
66 | const dataVal = _lodash.default.get(data, dataPath);
|
67 |
|
68 | if (dataVal !== undefined) {
|
69 | objToPush[logProp] = dataVal;
|
70 | }
|
71 | });
|
72 | } // remove data fields
|
73 |
|
74 |
|
75 | if (this._options.dataFieldsToRemove) {
|
76 | this._options.dataFieldsToRemove.forEach(dataProp => {
|
77 | delete data[dataProp];
|
78 | });
|
79 | } // serialize data
|
80 |
|
81 |
|
82 | if (Object.keys(data).length > 0) objToPush.data = (0, _jsonStringifySafe.default)(data);
|
83 | } // log to console
|
84 |
|
85 |
|
86 | console.log(`${objToPush.time_ts.substr(11, 12)}: ${(0, _stringUtils.padRight)(objToPush.level, 5, ' ')} [${objToPush.module}] ${objToPush.event} ${objToPush.data || ''}`); // eslint-disable-line no-console
|
87 |
|
88 | this._logObjects.push(objToPush);
|
89 | } catch (err) {
|
90 | console.error('Failed to queue a log record', logObj, err); // eslint-disable-line no-console
|
91 | }
|
92 | });
|
93 |
|
94 | _defineProperty(this, "flushLogs", async () => {
|
95 | try {
|
96 | if (!this._logObjects.length || !this._options.host) return;
|
97 | const logsToFlush = this._logObjects;
|
98 | this._logObjects = [];
|
99 | await (0, _httpUtils.httpReq)(`${this._options.noHTTPS ? 'http' : 'https'}://${this._options.host}/p1`, {
|
100 | method: 'POST',
|
101 | body: {
|
102 | beacons: logsToFlush,
|
103 | common: this._options.systemMeta,
|
104 | client_sending_time_ms: Date.now()
|
105 | },
|
106 | timeout: 10000
|
107 | });
|
108 | } catch (err) {
|
109 | console.error('Failed to flush logs', new Date().toUTCString(), err); // eslint-disable-line no-console
|
110 | }
|
111 | });
|
112 |
|
113 | this._options = options;
|
114 |
|
115 | if (this._options.host) {
|
116 | setInterval(this.flushLogs, LOG_FLUSH_INTERVAL_MS);
|
117 | }
|
118 | }
|
119 |
|
120 | }
|
121 |
|
122 | exports.default = S3Logger;
|
123 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TM0xvZ2dlci5qcyJdLCJuYW1lcyI6WyJMT0dfRkxVU0hfSU5URVJWQUxfTVMiLCJTM0xvZ2dlciIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsImxvZ09iaiIsIm5vd01TIiwiRGF0ZSIsIm5vdyIsImRhdGEiLCJtZXNzYWdlIiwicmVzdExvZ09iaiIsIm9ialRvUHVzaCIsImV2ZW50IiwicmVjb3JkX251bSIsIl9sb2dSZWNvcmROdW0iLCJ0aW1lX21zIiwidGltZV90cyIsInRvSVNPU3RyaW5nIiwidmFsdWUiLCJ0b1N0cmluZyIsIl9vcHRpb25zIiwiZGF0YUZpZWxkc1RvUHJvbW90ZSIsIk9iamVjdCIsImVudHJpZXMiLCJmb3JFYWNoIiwibG9nUHJvcCIsImRhdGFQYXRoIiwiZGF0YVZhbCIsIl8iLCJnZXQiLCJ1bmRlZmluZWQiLCJkYXRhRmllbGRzVG9SZW1vdmUiLCJkYXRhUHJvcCIsImtleXMiLCJsZW5ndGgiLCJjb25zb2xlIiwibG9nIiwic3Vic3RyIiwibGV2ZWwiLCJtb2R1bGUiLCJfbG9nT2JqZWN0cyIsInB1c2giLCJlcnIiLCJlcnJvciIsImhvc3QiLCJsb2dzVG9GbHVzaCIsIm5vSFRUUFMiLCJtZXRob2QiLCJib2R5IiwiYmVhY29ucyIsImNvbW1vbiIsInN5c3RlbU1ldGEiLCJjbGllbnRfc2VuZGluZ190aW1lX21zIiwidGltZW91dCIsInRvVVRDU3RyaW5nIiwic2V0SW50ZXJ2YWwiLCJmbHVzaExvZ3MiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFJQTs7QUFDQTs7QUFFQTs7QUFDQTs7Ozs7Ozs7Ozs7O0FBRUEsTUFBTUEscUJBQXFCLEdBQUcsSUFBSSxJQUFsQzs7QUFVZSxNQUFNQyxRQUFOLENBQWU7QUFPNUJDLEVBQUFBLFdBQVcsQ0FBQ0MsT0FBRCxFQUF5QjtBQUFBLHlDQUxQLEVBS087O0FBQUEsMkNBSlosQ0FJWTs7QUFBQTs7QUFBQSw0Q0FTbEJDLE1BQUQsSUFBMEI7QUFDekMsVUFBSTtBQUNGLGNBQU1D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QUFLLEtBQUsxQixRQUFMLENBQWN3QixJQUFLLEtBQTVFLEVBQWtGO0FBQ3RGRyxVQUFBQSxNQUFNLEVBQUUsTUFEOEU7QUFFdEZDLFVBQUFBLElBQUksRUFBRTtBQUNKQyxZQUFBQSxPQUFPLEVBQUVKLFdBREw7QUFFSkssWUFBQUEsTUFBTSxFQUFFLEtBQUs5QixRQUFMLENBQWMrQixVQUZsQjtBQUdKQyxZQUFBQSxzQkFBc0IsRUFBRTlDLElBQUksQ0FBQ0MsR0FBTDtBQUhwQixXQUZnRjtBQU90RjhDLFVBQUFBLE9BQU8sRUFBRTtBQVA2RSxTQUFsRixDQUFOO0FBVUQsT0FqQkQsQ0FpQkUsT0FBT1gsR0FBUCxFQUFZO0FBQ1pQLFFBQUFBLE9BQU8sQ0FBQ1EsS0FBUixDQUFjLHNCQUFkLEVBQXVDLElBQUlyQyxJQUFKLEVBQUQsQ0FBYWdELFdBQWIsRUFBdEMsRUFBa0VaLEdBQWxFLEVBRFksQ0FDMkQ7QUFDeEU7QUFDRixLQXpGbUM7O0FBQ2xDLFNBQUt0QixRQUFMLEdBQWdCakIsT0FBaEI7O0FBRUEsUUFBSSxLQUFLaUIsUUFBTCxDQUFjd0IsSUFBbEIsRUFBd0I7QUFDdEJXLE1BQUFBLFdBQVcsQ0FBQyxLQUFLQyxTQUFOLEVBQWlCeEQscUJBQWpCLENBQVg7QUFDRDtBQUNGOztBQWIyQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEBmbG93XG5cbi8vIE5PVEU6IGRvbid0IHVzZSBNb2R1bGUgaGVyZSwgc2luY2UgTW9kdWxlIHVzZXMgdGhpcyBjbGFzc1xuXG5pbXBvcnQgc3RyaW5naWZ5IGZyb20gJ2pzb24tc3RyaW5naWZ5LXNhZmUnXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnXG5cbmltcG9ydCB7IGh0dHBSZXEgfSBmcm9tICcuL2h0dHBVdGlscydcbmltcG9ydCB7IHBhZFJpZ2h0IH0gZnJvbSAnLi9zdHJpbmdVdGlscydcblxuY29uc3QgTE9HX0ZMVVNIX0lOVEVSVkFMX01TID0gNSAqIDEwMDBcblxudHlwZSBMb2dnZXJPcHRpb25zID0ge1xuICBub0hUVFBTPzogYm9vbGVhbixcbiAgaG9zdD86ID9zdHJpbmcsXG4gIGRhdGFGaWVsZHNUb1Byb21vdGU/OiA/eyBbaWQ6IHN0cmluZ106IHN0cmluZyB9LFxuICBkYXRhRmllbGRzVG9SZW1vdmU/OiA/QXJyYXk8c3RyaW5nPiwgXG4gIHN5c3RlbU1ldGE/OiA/e30sXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFMzTG9nZ2VyIHtcblxuICBfbG9nT2JqZWN0czogQXJyYXk8T2JqZWN0PiA9IFtdXG4gIF9sb2dSZWNvcmROdW06IG51bWJlciA9IDBcbiAgX29wdGlvbnM6IExvZ2dlck9wdGlvbnNcblxuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IExvZ2dlck9wdGlvbnMpIHtcbiAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9uc1xuXG4gICAgaWYgKHRoaXMuX29wdGlvbnMuaG9zdCkge1xuICAgICAgc2V0SW50ZXJ2YWwodGhpcy5mbHVzaExvZ3MsIExPR19GTFVTSF9JTlRFUlZBTF9NUylcbiAgICB9XG4gIH1cblxuXG4gIHF1ZXVlTG9nUmVjb3JkID0gKGxvZ09iajogT2JqZWN0KTogdm9pZCA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG5vd01TID0gRGF0ZS5ub3coKVxuXG4gICAgICBsZXQgeyBkYXRhLCBtZXNzYWdlLCAuLi5yZXN0TG9nT2JqIH0gPSBsb2dPYmpcblxuICAgICAgY29uc3Qgb2JqVG9QdXNoID0ge1xuICAgICAgICBldmVudDogbWVzc2FnZSxcblxuICAgICAgICAuLi5yZXN0TG9nT2JqLFxuXG4gICAgICAgIHJlY29yZF9udW06ICsrdGhpcy5fbG9nUmVjb3JkTnVtLFxuICAgICAgICB0aW1lX21zOiBub3dNUyxcbiAgICAgICAgdGltZV90czogbmV3IERhdGUobm93TVMpLnRvSVNPU3RyaW5nKCksXG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhICE9IG51bGwpIHtcblxuICAgICAgICAvLyBtYWtlIHN1cmUgZGF0YSBpcyBhIG9iamVjdFxuICAgICAgICBpZiAodHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgZGF0YSA9IHtcbiAgICAgICAgICAgIHZhbHVlOiBkYXRhLnRvU3RyaW5nKClcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwcm9tb3RlIGRhdGEgZmllbGRzXG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLmRhdGFGaWVsZHNUb1Byb21vdGUpIHtcbiAgICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLl9vcHRpb25zLmRhdGFGaWVsZHNUb1Byb21vdGUpLmZvckVhY2goKFtsb2dQcm9wLCBkYXRhUGF0aF0pID0+IHtcbiAgICAgICAgICAgIC8vICRGbG93SWdub3JlXG4gICAgICAgICAgICBjb25zdCBkYXRhVmFsID0gXy5nZXQoZGF0YSwgZGF0YVBhdGgpXG4gICAgICAgICAgICBpZiAoZGF0YVZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIG9ialRvUHVzaFtsb2dQcm9wXSA9IGRhdGFWYWxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVtb3ZlIGRhdGEgZmllbGRzXG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLmRhdGFGaWVsZHNUb1JlbW92ZSkge1xuICAgICAgICAgIHRoaXMuX29wdGlvbnMuZGF0YUZpZWxkc1RvUmVtb3ZlLmZvckVhY2goZGF0YVByb3AgPT4ge1xuICAgICAgICAgICAgZGVsZXRlIGRhdGFbZGF0YVByb3BdXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNlcmlhbGl6ZSBkYXRhXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPiAwKVxuICAgICAgICAgIG9ialRvUHVzaC5kYXRhID0gc3RyaW5naWZ5KGRhdGEpXG5cbiAgICAgIH1cblxuICAgICAgLy8gbG9nIHRvIGNvbnNvbGVcbiAgICAgIGNvbnNvbGUubG9nKGAke29ialRvUHVzaC50aW1lX3RzLnN1YnN0cigxMSwgMTIpfTogJHtwYWRSaWdodChvYmpUb1B1c2gubGV2ZWwsIDUsICcgJyl9IFske29ialRvUHVzaC5tb2R1bGV9XSAke29ialRvUHVzaC5ldmVudH0gJHtvYmpUb1B1c2guZGF0YSB8fCAnJ31gKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgXG4gICAgICB0aGlzLl9sb2dPYmplY3RzLnB1c2gob2JqVG9QdXNoKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHF1ZXVlIGEgbG9nIHJlY29yZCcsIGxvZ09iaiwgZXJyKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICB9XG4gIH1cblxuXG4gIGZsdXNoTG9ncyA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLl9sb2dPYmplY3RzLmxlbmd0aCB8fCAhdGhpcy5fb3B0aW9ucy5ob3N0KVxuICAgICAgICByZXR1cm5cblxuICAgICAgY29uc3QgbG9nc1RvRmx1c2ggPSB0aGlzLl9sb2dPYmplY3RzXG4gICAgICB0aGlzLl9sb2dPYmplY3RzID0gW11cblxuICAgICAgYXdhaXQgaHR0cFJlcShgJHt0aGlzLl9vcHRpb25zLm5vSFRUUFMgPyAnaHR0cCcgOiAnaHR0cHMnfTovLyR7dGhpcy5fb3B0aW9ucy5ob3N0fS9wMWAsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsIFxuICAgICAgICBib2R5OiB7XG4gICAgICAgICAgYmVhY29uczogbG9nc1RvRmx1c2gsXG4gICAgICAgICAgY29tbW9uOiB0aGlzLl9vcHRpb25zLnN5c3RlbU1ldGEsXG4gICAgICAgICAgY2xpZW50X3NlbmRpbmdfdGltZV9tczogRGF0ZS5ub3coKSxcbiAgICAgICAgfSxcbiAgICAgICAgdGltZW91dDogMTAwMDAsXG4gICAgICB9KVxuXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZmx1c2ggbG9ncycsIChuZXcgRGF0ZSgpKS50b1VUQ1N0cmluZygpLCBlcnIpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgIH1cbiAgfVxufVxuIl19 |
\ | No newline at end of file |