@webex/plugin-logger 3.0.0-beta.4 → 3.0.0-beta.400
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config.js +1 -5
- package/dist/config.js.map +1 -1
- package/dist/index.js +1 -13
- package/dist/index.js.map +1 -1
- package/dist/logger.js +53 -78
- package/dist/logger.js.map +1 -1
- package/package.json +7 -7
- package/src/config.js +2 -2
- package/src/index.js +2 -5
- package/src/logger.js +80 -44
- package/test/unit/spec/logger.js +340 -96
package/src/logger.js
CHANGED
|
@@ -3,17 +3,8 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import {inBrowser, patterns} from '@webex/common';
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
WebexPlugin
|
|
9
|
-
} from '@webex/webex-core';
|
|
10
|
-
import {
|
|
11
|
-
cloneDeep,
|
|
12
|
-
has,
|
|
13
|
-
isArray,
|
|
14
|
-
isObject,
|
|
15
|
-
isString
|
|
16
|
-
} from 'lodash';
|
|
6
|
+
import {WebexHttpError, WebexPlugin} from '@webex/webex-core';
|
|
7
|
+
import {cloneDeep, has, isArray, isObject, isString} from 'lodash';
|
|
17
8
|
|
|
18
9
|
const precedence = {
|
|
19
10
|
silent: 0,
|
|
@@ -24,7 +15,7 @@ const precedence = {
|
|
|
24
15
|
log: 5,
|
|
25
16
|
info: 6,
|
|
26
17
|
debug: 7,
|
|
27
|
-
trace: 8
|
|
18
|
+
trace: 8,
|
|
28
19
|
};
|
|
29
20
|
|
|
30
21
|
export const levels = Object.keys(precedence).filter((level) => level !== 'silent');
|
|
@@ -34,12 +25,12 @@ const fallbacks = {
|
|
|
34
25
|
warn: ['error', 'log'],
|
|
35
26
|
info: ['log'],
|
|
36
27
|
debug: ['info', 'log'],
|
|
37
|
-
trace: ['debug', 'info', 'log']
|
|
28
|
+
trace: ['debug', 'info', 'log'],
|
|
38
29
|
};
|
|
39
30
|
|
|
40
31
|
const LOG_TYPES = {
|
|
41
32
|
SDK: 'sdk',
|
|
42
|
-
CLIENT: 'client'
|
|
33
|
+
CLIENT: 'client',
|
|
43
34
|
};
|
|
44
35
|
|
|
45
36
|
const SDK_LOG_TYPE_NAME = 'wx-js-sdk';
|
|
@@ -69,6 +60,9 @@ function walkAndFilter(object, visited = []) {
|
|
|
69
60
|
if (patterns.containsEmails.test(object)) {
|
|
70
61
|
return object.replace(patterns.containsEmails, '[REDACTED]');
|
|
71
62
|
}
|
|
63
|
+
if (patterns.containsMTID.test(object)) {
|
|
64
|
+
return object.replace(patterns.containsMTID, '$1[REDACTED]');
|
|
65
|
+
}
|
|
72
66
|
}
|
|
73
67
|
|
|
74
68
|
return object;
|
|
@@ -77,8 +71,7 @@ function walkAndFilter(object, visited = []) {
|
|
|
77
71
|
for (const [key, value] of Object.entries(object)) {
|
|
78
72
|
if (authTokenKeyPattern.test(key)) {
|
|
79
73
|
Reflect.deleteProperty(object, key);
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
74
|
+
} else {
|
|
82
75
|
object[key] = walkAndFilter(value, visited);
|
|
83
76
|
}
|
|
84
77
|
}
|
|
@@ -97,14 +90,14 @@ const Logger = WebexPlugin.extend({
|
|
|
97
90
|
cache: false,
|
|
98
91
|
fn() {
|
|
99
92
|
return this.getCurrentLevel();
|
|
100
|
-
}
|
|
93
|
+
},
|
|
101
94
|
},
|
|
102
95
|
client_level: {
|
|
103
96
|
cache: false,
|
|
104
97
|
fn() {
|
|
105
98
|
return this.getCurrentClientLevel();
|
|
106
|
-
}
|
|
107
|
-
}
|
|
99
|
+
},
|
|
100
|
+
},
|
|
108
101
|
},
|
|
109
102
|
session: {
|
|
110
103
|
// for when configured to use single buffer
|
|
@@ -112,27 +105,27 @@ const Logger = WebexPlugin.extend({
|
|
|
112
105
|
type: 'array',
|
|
113
106
|
default() {
|
|
114
107
|
return [];
|
|
115
|
-
}
|
|
108
|
+
},
|
|
116
109
|
},
|
|
117
110
|
groupLevel: {
|
|
118
111
|
type: 'number',
|
|
119
112
|
default() {
|
|
120
113
|
return 0;
|
|
121
|
-
}
|
|
114
|
+
},
|
|
122
115
|
},
|
|
123
116
|
// for when configured to use separate buffers
|
|
124
117
|
sdkBuffer: {
|
|
125
118
|
type: 'array',
|
|
126
119
|
default() {
|
|
127
120
|
return [];
|
|
128
|
-
}
|
|
121
|
+
},
|
|
129
122
|
},
|
|
130
123
|
clientBuffer: {
|
|
131
124
|
type: 'array',
|
|
132
125
|
default() {
|
|
133
126
|
return [];
|
|
134
|
-
}
|
|
135
|
-
}
|
|
127
|
+
},
|
|
128
|
+
},
|
|
136
129
|
},
|
|
137
130
|
|
|
138
131
|
/**
|
|
@@ -178,7 +171,10 @@ const Logger = WebexPlugin.extend({
|
|
|
178
171
|
* @returns {boolean}
|
|
179
172
|
*/
|
|
180
173
|
shouldPrint(level, type = LOG_TYPES.SDK) {
|
|
181
|
-
return
|
|
174
|
+
return (
|
|
175
|
+
precedence[level] <=
|
|
176
|
+
precedence[type === LOG_TYPES.SDK ? this.getCurrentLevel() : this.getCurrentClientLevel()]
|
|
177
|
+
);
|
|
182
178
|
},
|
|
183
179
|
|
|
184
180
|
/**
|
|
@@ -194,7 +190,10 @@ const Logger = WebexPlugin.extend({
|
|
|
194
190
|
* @returns {boolean}
|
|
195
191
|
*/
|
|
196
192
|
shouldBuffer(level) {
|
|
197
|
-
return
|
|
193
|
+
return (
|
|
194
|
+
precedence[level] <=
|
|
195
|
+
(this.config.bufferLogLevel ? precedence[this.config.bufferLogLevel] : precedence.info)
|
|
196
|
+
);
|
|
198
197
|
},
|
|
199
198
|
|
|
200
199
|
/**
|
|
@@ -223,7 +222,8 @@ const Logger = WebexPlugin.extend({
|
|
|
223
222
|
}
|
|
224
223
|
|
|
225
224
|
// Use server-side-feature toggles to configure log levels
|
|
226
|
-
const level =
|
|
225
|
+
const level =
|
|
226
|
+
this.webex.internal.device && this.webex.internal.device.features.developer.get('log-level');
|
|
227
227
|
|
|
228
228
|
if (level) {
|
|
229
229
|
if (levels.includes(level)) {
|
|
@@ -275,11 +275,14 @@ const Logger = WebexPlugin.extend({
|
|
|
275
275
|
// merge the client and sdk buffers
|
|
276
276
|
// while we have entries in either buffer
|
|
277
277
|
while (clientIndex < this.clientBuffer.length || sdkIndex < this.sdkBuffer.length) {
|
|
278
|
-
|
|
279
|
-
if (
|
|
278
|
+
// if we have remaining entries in the SDK buffer
|
|
279
|
+
if (
|
|
280
|
+
sdkIndex < this.sdkBuffer.length &&
|
|
280
281
|
// and we haven't exhausted all the client buffer entries, or SDK date is before client date
|
|
281
282
|
(clientIndex >= this.clientBuffer.length ||
|
|
282
|
-
|
|
283
|
+
new Date(getDate(this.sdkBuffer[sdkIndex])) <=
|
|
284
|
+
new Date(getDate(this.clientBuffer[clientIndex])))
|
|
285
|
+
) {
|
|
283
286
|
// then add to the SDK buffer
|
|
284
287
|
buffer.push(this.sdkBuffer[sdkIndex]);
|
|
285
288
|
sdkIndex += 1;
|
|
@@ -291,13 +294,12 @@ const Logger = WebexPlugin.extend({
|
|
|
291
294
|
clientIndex += 1;
|
|
292
295
|
}
|
|
293
296
|
}
|
|
294
|
-
}
|
|
295
|
-
else {
|
|
297
|
+
} else {
|
|
296
298
|
buffer = this.buffer;
|
|
297
299
|
}
|
|
298
300
|
|
|
299
301
|
return buffer.join('\n');
|
|
300
|
-
}
|
|
302
|
+
},
|
|
301
303
|
});
|
|
302
304
|
|
|
303
305
|
/**
|
|
@@ -323,16 +325,18 @@ function makeLoggerMethod(level, impl, type, neverPrint = false, alwaysBuffer =
|
|
|
323
325
|
// in Ampersand, even if the initialize method is used to set this up. so we keep the type to achieve
|
|
324
326
|
// a sort of late binding to allow retrieving a name from config.
|
|
325
327
|
const logType = type;
|
|
326
|
-
const clientName =
|
|
328
|
+
const clientName =
|
|
329
|
+
logType === LOG_TYPES.SDK ? SDK_LOG_TYPE_NAME : this.config.clientName || logType;
|
|
327
330
|
|
|
328
331
|
let buffer;
|
|
329
332
|
let historyLength;
|
|
330
333
|
|
|
331
334
|
if (this.config.separateLogBuffers) {
|
|
332
|
-
historyLength = this.config.clientHistoryLength
|
|
335
|
+
historyLength = this.config.clientHistoryLength
|
|
336
|
+
? this.config.clientHistoryLength
|
|
337
|
+
: this.config.historyLength;
|
|
333
338
|
buffer = logType === LOG_TYPES.SDK ? this.sdkBuffer : this.clientBuffer;
|
|
334
|
-
}
|
|
335
|
-
else {
|
|
339
|
+
} else {
|
|
336
340
|
buffer = this.buffer;
|
|
337
341
|
historyLength = this.config.historyLength;
|
|
338
342
|
}
|
|
@@ -350,6 +354,29 @@ function makeLoggerMethod(level, impl, type, neverPrint = false, alwaysBuffer =
|
|
|
350
354
|
if (item instanceof WebexHttpError) {
|
|
351
355
|
return item.toString();
|
|
352
356
|
}
|
|
357
|
+
if (typeof item === 'object') {
|
|
358
|
+
let cache = [];
|
|
359
|
+
let returnItem;
|
|
360
|
+
try {
|
|
361
|
+
returnItem = JSON.stringify(item, (_key, value) => {
|
|
362
|
+
if (typeof value === 'object' && value !== null) {
|
|
363
|
+
if (cache.includes(value)) {
|
|
364
|
+
// Circular reference found, discard key
|
|
365
|
+
return undefined;
|
|
366
|
+
}
|
|
367
|
+
// Store value in our collection
|
|
368
|
+
cache.push(value);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
return value;
|
|
372
|
+
});
|
|
373
|
+
} catch (e) {
|
|
374
|
+
returnItem = `Failed to stringify: ${item}`;
|
|
375
|
+
}
|
|
376
|
+
cache = null;
|
|
377
|
+
|
|
378
|
+
return returnItem;
|
|
379
|
+
}
|
|
353
380
|
|
|
354
381
|
return item;
|
|
355
382
|
});
|
|
@@ -376,13 +403,12 @@ function makeLoggerMethod(level, impl, type, neverPrint = false, alwaysBuffer =
|
|
|
376
403
|
stringified.unshift('| '.repeat(this.groupLevel));
|
|
377
404
|
buffer.push(stringified);
|
|
378
405
|
if (buffer.length > historyLength) {
|
|
379
|
-
buffer.
|
|
406
|
+
buffer.splice(0, buffer.length - historyLength);
|
|
380
407
|
}
|
|
381
408
|
if (level === 'group') this.groupLevel += 1;
|
|
382
409
|
if (level === 'groupEnd' && this.groupLevel > 0) this.groupLevel -= 1;
|
|
383
410
|
}
|
|
384
|
-
}
|
|
385
|
-
catch (reason) {
|
|
411
|
+
} catch (reason) {
|
|
386
412
|
if (!neverPrint) {
|
|
387
413
|
/* istanbul ignore next */
|
|
388
414
|
// eslint-disable-next-line no-console
|
|
@@ -404,14 +430,24 @@ levels.forEach((level) => {
|
|
|
404
430
|
}
|
|
405
431
|
}
|
|
406
432
|
|
|
407
|
-
|
|
408
433
|
// eslint-disable-next-line complexity
|
|
409
434
|
Logger.prototype[`client_${level}`] = makeLoggerMethod(level, impl, LOG_TYPES.CLIENT);
|
|
410
435
|
Logger.prototype[level] = makeLoggerMethod(level, impl, LOG_TYPES.SDK);
|
|
411
436
|
});
|
|
412
437
|
|
|
413
|
-
Logger.prototype.client_logToBuffer =
|
|
414
|
-
|
|
415
|
-
|
|
438
|
+
Logger.prototype.client_logToBuffer = makeLoggerMethod(
|
|
439
|
+
levels.info,
|
|
440
|
+
levels.info,
|
|
441
|
+
LOG_TYPES.CLIENT,
|
|
442
|
+
true,
|
|
443
|
+
true
|
|
444
|
+
);
|
|
445
|
+
Logger.prototype.logToBuffer = makeLoggerMethod(
|
|
446
|
+
levels.info,
|
|
447
|
+
levels.info,
|
|
448
|
+
LOG_TYPES.SDK,
|
|
449
|
+
true,
|
|
450
|
+
true
|
|
451
|
+
);
|
|
416
452
|
|
|
417
453
|
export default Logger;
|