@villedemontreal/logger 6.5.1

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.
@@ -0,0 +1,564 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.timeout = void 0;
4
+ const general_utils_1 = require("@villedemontreal/general-utils");
5
+ const chai_1 = require("chai");
6
+ const fs = require("fs-extra");
7
+ const _ = require("lodash");
8
+ const configs_1 = require("./config/configs");
9
+ const constants_1 = require("./config/constants");
10
+ const lazyLogger_1 = require("./lazyLogger");
11
+ const logger_1 = require("./logger");
12
+ const TESTING_CID = 'test-cid';
13
+ /**
14
+ * The "--no-timeouts" arg doesn't work to disable
15
+ * the Mocha timeouts (while debugging) if a timeout
16
+ * is specified in the code itself. Using this to set the
17
+ * timeouts does.
18
+ */
19
+ function timeout(mocha, milliSec) {
20
+ mocha.timeout(process.argv.includes('--no-timeouts') ? 0 : milliSec);
21
+ }
22
+ exports.timeout = timeout;
23
+ // ==========================================
24
+ // Logger tests
25
+ // ==========================================
26
+ describe('Logger tests', () => {
27
+ describe('General tests', () => {
28
+ let loggerConfig;
29
+ let logger;
30
+ const stdoutWriteBackup = process.stdout.write;
31
+ let output;
32
+ before(async () => {
33
+ // ==========================================
34
+ // Tweaks the configs for this tests file.
35
+ // ==========================================
36
+ loggerConfig = new configs_1.LoggerConfigs(() => TESTING_CID);
37
+ loggerConfig.setLogHumanReadableinConsole(false);
38
+ loggerConfig.setLogSource(true);
39
+ loggerConfig.setLogLevel(logger_1.LogLevel.INFO);
40
+ // ==========================================
41
+ // Creates the logger
42
+ // ==========================================
43
+ logger_1.initLogger(loggerConfig, 'default', true);
44
+ logger = new logger_1.Logger('test');
45
+ });
46
+ let expectTwoCalls = false;
47
+ let keepSecondCallOnly = false;
48
+ let firstCallDone = false;
49
+ function restartCustomWriter() {
50
+ output = '';
51
+ expectTwoCalls = false;
52
+ keepSecondCallOnly = false;
53
+ firstCallDone = false;
54
+ // A stadard "function" is required here, because
55
+ // of the use of "arguments".
56
+ // tslint:disable-next-line:only-arrow-functions
57
+ process.stdout.write = function () {
58
+ if (!expectTwoCalls) {
59
+ output += arguments[0];
60
+ process.stdout.write = stdoutWriteBackup;
61
+ return;
62
+ }
63
+ if (!firstCallDone) {
64
+ if (!keepSecondCallOnly) {
65
+ output += arguments[0];
66
+ }
67
+ firstCallDone = true;
68
+ }
69
+ else {
70
+ output += arguments[0];
71
+ process.stdout.write = stdoutWriteBackup;
72
+ }
73
+ };
74
+ chai_1.assert.isTrue(general_utils_1.utils.isBlank(output));
75
+ }
76
+ beforeEach(async () => {
77
+ restartCustomWriter();
78
+ });
79
+ it('string message', async () => {
80
+ logger.error('allo');
81
+ chai_1.assert.isTrue(!general_utils_1.utils.isBlank(output));
82
+ const jsonObj = JSON.parse(output);
83
+ chai_1.assert.isTrue(_.isObject(jsonObj));
84
+ chai_1.assert.strictEqual(jsonObj.name, 'test');
85
+ chai_1.assert.strictEqual(jsonObj.msg, 'allo');
86
+ chai_1.assert.isNotNull(jsonObj.src);
87
+ chai_1.assert.isNotNull(jsonObj.src.file);
88
+ chai_1.assert.isNotNull(jsonObj.src.line);
89
+ chai_1.assert.strictEqual(jsonObj.logType, constants_1.constants.logging.logType.MONTREAL);
90
+ chai_1.assert.strictEqual(jsonObj.logTypeVersion, '2');
91
+ });
92
+ it('string message and extra text message', async () => {
93
+ logger.error('allo', 'salut');
94
+ chai_1.assert.isTrue(!general_utils_1.utils.isBlank(output));
95
+ const jsonObj = JSON.parse(output);
96
+ chai_1.assert.isTrue(_.isObject(jsonObj));
97
+ chai_1.assert.strictEqual(jsonObj.msg, 'allo - salut');
98
+ chai_1.assert.isNotNull(jsonObj.src);
99
+ chai_1.assert.isNotNull(jsonObj.src.file);
100
+ chai_1.assert.isNotNull(jsonObj.src.line);
101
+ chai_1.assert.strictEqual(jsonObj.logType, constants_1.constants.logging.logType.MONTREAL);
102
+ chai_1.assert.strictEqual(jsonObj.logTypeVersion, '2');
103
+ });
104
+ it('custom object message', async () => {
105
+ logger.error({
106
+ key1: {
107
+ key3: 'val3',
108
+ key4: 'val4'
109
+ },
110
+ key2: 'val2',
111
+ msg: 'blabla'
112
+ });
113
+ chai_1.assert.isTrue(!general_utils_1.utils.isBlank(output));
114
+ const jsonObj = JSON.parse(output);
115
+ chai_1.assert.strictEqual(jsonObj.key2, 'val2');
116
+ chai_1.assert.strictEqual(jsonObj.msg, 'blabla');
117
+ chai_1.assert.deepEqual(jsonObj.key1, {
118
+ key3: 'val3',
119
+ key4: 'val4'
120
+ });
121
+ chai_1.assert.isNotNull(jsonObj.src);
122
+ chai_1.assert.isNotNull(jsonObj.src.file);
123
+ chai_1.assert.isNotNull(jsonObj.src.line);
124
+ chai_1.assert.strictEqual(jsonObj.logType, constants_1.constants.logging.logType.MONTREAL);
125
+ chai_1.assert.strictEqual(jsonObj.logTypeVersion, '2');
126
+ });
127
+ it('custom object message and extra text message', async () => {
128
+ logger.error({
129
+ key1: {
130
+ key3: 'val3',
131
+ key4: 'val4'
132
+ },
133
+ key2: 'val2',
134
+ msg: 'blabla'
135
+ }, 'my text message');
136
+ chai_1.assert.isTrue(!general_utils_1.utils.isBlank(output));
137
+ const jsonObj = JSON.parse(output);
138
+ chai_1.assert.strictEqual(jsonObj.key2, 'val2');
139
+ chai_1.assert.strictEqual(jsonObj.msg, 'blabla - my text message');
140
+ chai_1.assert.deepEqual(jsonObj.key1, {
141
+ key3: 'val3',
142
+ key4: 'val4'
143
+ });
144
+ chai_1.assert.isNotNull(jsonObj.src);
145
+ chai_1.assert.isNotNull(jsonObj.src.file);
146
+ chai_1.assert.isNotNull(jsonObj.src.line);
147
+ chai_1.assert.strictEqual(jsonObj.logType, constants_1.constants.logging.logType.MONTREAL);
148
+ chai_1.assert.strictEqual(jsonObj.logTypeVersion, '2');
149
+ });
150
+ it('regular Error object and extra text message', async () => {
151
+ logger.error(new Error('my error message'), 'my text message');
152
+ chai_1.assert.isTrue(!general_utils_1.utils.isBlank(output));
153
+ const jsonObj = JSON.parse(output);
154
+ chai_1.assert.strictEqual(jsonObj.msg, 'my error message - my text message');
155
+ chai_1.assert.isTrue(!general_utils_1.utils.isBlank(jsonObj.stack));
156
+ chai_1.assert.isTrue(!general_utils_1.utils.isBlank(jsonObj.name));
157
+ chai_1.assert.isNotNull(jsonObj.src);
158
+ chai_1.assert.isNotNull(jsonObj.src.file);
159
+ chai_1.assert.isNotNull(jsonObj.src.line);
160
+ chai_1.assert.strictEqual(jsonObj.logType, constants_1.constants.logging.logType.MONTREAL);
161
+ chai_1.assert.strictEqual(jsonObj.logTypeVersion, '2');
162
+ });
163
+ it('null Error object and extra text message', async () => {
164
+ logger.error(null, 'my text message');
165
+ chai_1.assert.isTrue(!general_utils_1.utils.isBlank(output));
166
+ const jsonObj = JSON.parse(output);
167
+ chai_1.assert.strictEqual(jsonObj.msg, 'my text message');
168
+ chai_1.assert.isTrue(!general_utils_1.utils.isBlank(jsonObj.name));
169
+ chai_1.assert.isNotNull(jsonObj.src);
170
+ chai_1.assert.isNotNull(jsonObj.src.file);
171
+ chai_1.assert.isNotNull(jsonObj.src.line);
172
+ chai_1.assert.strictEqual(jsonObj.logType, constants_1.constants.logging.logType.MONTREAL);
173
+ chai_1.assert.strictEqual(jsonObj.logTypeVersion, '2');
174
+ });
175
+ it('undefined Error object and extra text message', async () => {
176
+ logger.error(undefined, 'my text message');
177
+ chai_1.assert.isTrue(!general_utils_1.utils.isBlank(output));
178
+ const jsonObj = JSON.parse(output);
179
+ chai_1.assert.strictEqual(jsonObj.msg, 'my text message');
180
+ chai_1.assert.isTrue(!general_utils_1.utils.isBlank(jsonObj.name));
181
+ chai_1.assert.isNotNull(jsonObj.src);
182
+ chai_1.assert.isNotNull(jsonObj.src.file);
183
+ chai_1.assert.isNotNull(jsonObj.src.line);
184
+ chai_1.assert.strictEqual(jsonObj.logType, constants_1.constants.logging.logType.MONTREAL);
185
+ chai_1.assert.strictEqual(jsonObj.logTypeVersion, '2');
186
+ });
187
+ it('array message', async () => {
188
+ // ==========================================
189
+ // Two calls to "process.stdout.write" will
190
+ // be made because an error for the invalid
191
+ // array message will be logged!
192
+ // ==========================================
193
+ expectTwoCalls = true;
194
+ keepSecondCallOnly = true;
195
+ logger.error([
196
+ 'toto',
197
+ {
198
+ key1: 'val1',
199
+ key2: 'val2'
200
+ }
201
+ ]);
202
+ const jsonObj = JSON.parse(output);
203
+ chai_1.assert.deepEqual(jsonObj._arrayMsg, [
204
+ 'toto',
205
+ {
206
+ key1: 'val1',
207
+ key2: 'val2'
208
+ }
209
+ ]);
210
+ chai_1.assert.isNotNull(jsonObj.src);
211
+ chai_1.assert.isNotNull(jsonObj.src.file);
212
+ chai_1.assert.isNotNull(jsonObj.src.line);
213
+ });
214
+ it('array message and extra text message', async () => {
215
+ // ==========================================
216
+ // Two calls to "process.stdout.write" will
217
+ // be made because an error for the invalid
218
+ // array message will be logged!
219
+ // ==========================================
220
+ expectTwoCalls = true;
221
+ keepSecondCallOnly = true;
222
+ logger.error([
223
+ 'toto',
224
+ {
225
+ key1: 'val1',
226
+ key2: 'val2'
227
+ }
228
+ ], 'my text message');
229
+ const jsonObj = JSON.parse(output);
230
+ chai_1.assert.deepEqual(jsonObj._arrayMsg, [
231
+ 'toto',
232
+ {
233
+ key1: 'val1',
234
+ key2: 'val2'
235
+ }
236
+ ]);
237
+ chai_1.assert.strictEqual(jsonObj.msg, 'my text message');
238
+ chai_1.assert.isNotNull(jsonObj.src);
239
+ chai_1.assert.isNotNull(jsonObj.src.file);
240
+ chai_1.assert.isNotNull(jsonObj.src.line);
241
+ });
242
+ it('log level - debug', async () => {
243
+ logger.debug('allo');
244
+ chai_1.assert.strictEqual(output, '');
245
+ });
246
+ it('log level - info', async () => {
247
+ logger.info('allo');
248
+ const jsonObj = JSON.parse(output);
249
+ chai_1.assert.strictEqual(jsonObj.level, logger_1.convertLogLevelToPinoNumberLevel(logger_1.LogLevel.INFO));
250
+ });
251
+ it('log level - warning', async () => {
252
+ logger.warning('allo');
253
+ const jsonObj = JSON.parse(output);
254
+ chai_1.assert.strictEqual(jsonObj.level, logger_1.convertLogLevelToPinoNumberLevel(logger_1.LogLevel.WARNING));
255
+ });
256
+ it('log level - error', async () => {
257
+ logger.error('allo');
258
+ const jsonObj = JSON.parse(output);
259
+ chai_1.assert.strictEqual(jsonObj.level, logger_1.convertLogLevelToPinoNumberLevel(logger_1.LogLevel.ERROR));
260
+ });
261
+ it('log level - custom valid', async () => {
262
+ logger.log(logger_1.LogLevel.INFO, 'allo');
263
+ const jsonObj = JSON.parse(output);
264
+ chai_1.assert.strictEqual(jsonObj.level, logger_1.convertLogLevelToPinoNumberLevel(logger_1.LogLevel.INFO));
265
+ });
266
+ it('log level - custom invalid', async () => {
267
+ // ==========================================
268
+ // Two calls to "process.stdout.write" will
269
+ // be made because an error for the invalid
270
+ // level will be logged!
271
+ // ==========================================
272
+ expectTwoCalls = true;
273
+ keepSecondCallOnly = true;
274
+ logger.log('nope', 'allo');
275
+ const jsonObj = JSON.parse(output);
276
+ chai_1.assert.strictEqual(jsonObj.level, logger_1.convertLogLevelToPinoNumberLevel(logger_1.LogLevel.ERROR));
277
+ chai_1.assert.strictEqual(jsonObj.msg, 'allo');
278
+ });
279
+ it('newline after each log - string', async () => {
280
+ expectTwoCalls = true;
281
+ logger.error('111');
282
+ logger.error('222');
283
+ const pos = output.indexOf('\n');
284
+ chai_1.assert.isTrue(pos > -1);
285
+ chai_1.assert.strictEqual(output.charAt(pos + 1), '{');
286
+ });
287
+ it('newline after each log - complexe objects', async () => {
288
+ expectTwoCalls = true;
289
+ logger.error({
290
+ key1: 'val1',
291
+ key2: 'val2'
292
+ });
293
+ logger.error({
294
+ key1: 'val1',
295
+ key2: 'val2'
296
+ });
297
+ const pos = output.indexOf('\n');
298
+ chai_1.assert.isTrue(pos > -1);
299
+ chai_1.assert.strictEqual(output.charAt(pos + 1), '{');
300
+ });
301
+ it('date message', async () => {
302
+ const someDate = new Date();
303
+ logger.error(someDate);
304
+ chai_1.assert.isTrue(!general_utils_1.utils.isBlank(output));
305
+ const jsonObj = JSON.parse(output);
306
+ chai_1.assert.isTrue(_.isObject(jsonObj));
307
+ chai_1.assert.strictEqual(jsonObj.msg, someDate.toString());
308
+ chai_1.assert.isTrue(_.isDate(someDate));
309
+ });
310
+ // ==========================================
311
+ // Error controller log messages
312
+ // ==========================================
313
+ describe('Error controller log messages', () => {
314
+ it('app and version properties', async () => {
315
+ const packageJson = require(`${constants_1.constants.libRoot}/package.json`);
316
+ const appName = packageJson.name;
317
+ const appVersion = packageJson.version;
318
+ logger.error('allo');
319
+ chai_1.assert.isTrue(!general_utils_1.utils.isBlank(output));
320
+ const jsonObj = JSON.parse(output);
321
+ chai_1.assert.isTrue(_.isObject(jsonObj));
322
+ chai_1.assert.strictEqual(jsonObj[constants_1.constants.logging.properties.APP_NAME], appName);
323
+ chai_1.assert.strictEqual(jsonObj[constants_1.constants.logging.properties.APP_VERSION], appVersion);
324
+ chai_1.assert.strictEqual(jsonObj[constants_1.constants.logging.properties.CORRELATION_ID], TESTING_CID);
325
+ });
326
+ });
327
+ // ==========================================
328
+ // LazyLogger tests
329
+ // ==========================================
330
+ describe('LazyLogger tests', () => {
331
+ let lazyLogger;
332
+ beforeEach(async () => {
333
+ lazyLogger = new lazyLogger_1.LazyLogger('titi', (name) => {
334
+ const logger2 = new logger_1.Logger('titi');
335
+ return logger2;
336
+ });
337
+ });
338
+ it('debug', async () => {
339
+ lazyLogger.debug('allo');
340
+ chai_1.assert.isTrue(general_utils_1.utils.isBlank(output));
341
+ });
342
+ it('info', async () => {
343
+ lazyLogger.info('allo');
344
+ chai_1.assert.isTrue(!general_utils_1.utils.isBlank(output));
345
+ const jsonObj = JSON.parse(output);
346
+ chai_1.assert.isTrue(_.isObject(jsonObj));
347
+ chai_1.assert.strictEqual(jsonObj.level, logger_1.convertLogLevelToPinoNumberLevel(logger_1.LogLevel.INFO));
348
+ chai_1.assert.strictEqual(jsonObj.name, 'titi');
349
+ chai_1.assert.strictEqual(jsonObj.msg, 'allo');
350
+ chai_1.assert.isNotNull(jsonObj.src);
351
+ chai_1.assert.isNotNull(jsonObj.src.file);
352
+ chai_1.assert.isNotNull(jsonObj.src.line);
353
+ chai_1.assert.strictEqual(jsonObj.logType, constants_1.constants.logging.logType.MONTREAL);
354
+ chai_1.assert.strictEqual(jsonObj.logTypeVersion, '2');
355
+ chai_1.assert.strictEqual(jsonObj[constants_1.constants.logging.properties.CORRELATION_ID], TESTING_CID);
356
+ });
357
+ it('warning', async () => {
358
+ lazyLogger.warning('allo');
359
+ chai_1.assert.isTrue(!general_utils_1.utils.isBlank(output));
360
+ const jsonObj = JSON.parse(output);
361
+ chai_1.assert.isTrue(_.isObject(jsonObj));
362
+ chai_1.assert.strictEqual(jsonObj.level, logger_1.convertLogLevelToPinoNumberLevel(logger_1.LogLevel.WARNING));
363
+ chai_1.assert.strictEqual(jsonObj.name, 'titi');
364
+ chai_1.assert.strictEqual(jsonObj.msg, 'allo');
365
+ chai_1.assert.isNotNull(jsonObj.src);
366
+ chai_1.assert.isNotNull(jsonObj.src.file);
367
+ chai_1.assert.isNotNull(jsonObj.src.line);
368
+ chai_1.assert.strictEqual(jsonObj.logType, constants_1.constants.logging.logType.MONTREAL);
369
+ chai_1.assert.strictEqual(jsonObj.logTypeVersion, '2');
370
+ chai_1.assert.strictEqual(jsonObj[constants_1.constants.logging.properties.CORRELATION_ID], TESTING_CID);
371
+ });
372
+ it('error', async () => {
373
+ lazyLogger.error('allo');
374
+ chai_1.assert.isTrue(!general_utils_1.utils.isBlank(output));
375
+ const jsonObj = JSON.parse(output);
376
+ chai_1.assert.isTrue(_.isObject(jsonObj));
377
+ chai_1.assert.strictEqual(jsonObj.level, logger_1.convertLogLevelToPinoNumberLevel(logger_1.LogLevel.ERROR));
378
+ chai_1.assert.strictEqual(jsonObj.name, 'titi');
379
+ chai_1.assert.strictEqual(jsonObj.msg, 'allo');
380
+ chai_1.assert.isNotNull(jsonObj.src);
381
+ chai_1.assert.isNotNull(jsonObj.src.file);
382
+ chai_1.assert.isNotNull(jsonObj.src.line);
383
+ chai_1.assert.strictEqual(jsonObj.logType, constants_1.constants.logging.logType.MONTREAL);
384
+ chai_1.assert.strictEqual(jsonObj.logTypeVersion, '2');
385
+ chai_1.assert.strictEqual(jsonObj[constants_1.constants.logging.properties.CORRELATION_ID], TESTING_CID);
386
+ });
387
+ it('log', async () => {
388
+ lazyLogger.log(logger_1.LogLevel.INFO, 'allo');
389
+ chai_1.assert.isTrue(!general_utils_1.utils.isBlank(output));
390
+ const jsonObj = JSON.parse(output);
391
+ chai_1.assert.isTrue(_.isObject(jsonObj));
392
+ chai_1.assert.strictEqual(jsonObj.level, logger_1.convertLogLevelToPinoNumberLevel(logger_1.LogLevel.INFO));
393
+ chai_1.assert.strictEqual(jsonObj.name, 'titi');
394
+ chai_1.assert.strictEqual(jsonObj.msg, 'allo');
395
+ chai_1.assert.isNotNull(jsonObj.src);
396
+ chai_1.assert.isNotNull(jsonObj.src.file);
397
+ chai_1.assert.isNotNull(jsonObj.src.line);
398
+ chai_1.assert.strictEqual(jsonObj.logType, constants_1.constants.logging.logType.MONTREAL);
399
+ chai_1.assert.strictEqual(jsonObj.logTypeVersion, '2');
400
+ chai_1.assert.strictEqual(jsonObj[constants_1.constants.logging.properties.CORRELATION_ID], TESTING_CID);
401
+ });
402
+ it('logger creator is required', async () => {
403
+ try {
404
+ const lazyLogger2 = new lazyLogger_1.LazyLogger('titi', null);
405
+ chai_1.assert.fail();
406
+ chai_1.assert.isNotOk(lazyLogger2);
407
+ }
408
+ catch (err) {
409
+ /* ok */
410
+ }
411
+ try {
412
+ const lazyLogger3 = new lazyLogger_1.LazyLogger('titi', undefined);
413
+ chai_1.assert.fail();
414
+ chai_1.assert.isNotOk(lazyLogger3);
415
+ }
416
+ catch (err) {
417
+ /* ok */
418
+ }
419
+ });
420
+ });
421
+ // ==========================================
422
+ // Global log level
423
+ // ==========================================
424
+ describe('Global log level', () => {
425
+ let childLogger;
426
+ before(() => {
427
+ childLogger = logger_1.createLogger('testing child logger');
428
+ });
429
+ afterEach(() => {
430
+ // Reset the default logging
431
+ logger_1.setGlobalLogLevel(loggerConfig.getLogLevel());
432
+ });
433
+ it('log debug message when global log level set to DEBUG', () => {
434
+ logger_1.setGlobalLogLevel(logger_1.LogLevel.DEBUG);
435
+ logger.debug('this is the debug message');
436
+ let jsonObj = JSON.parse(output);
437
+ chai_1.assert.strictEqual(jsonObj.msg, 'this is the debug message');
438
+ restartCustomWriter();
439
+ childLogger.debug('this is the child logger debug message');
440
+ jsonObj = JSON.parse(output);
441
+ chai_1.assert.strictEqual(jsonObj.msg, 'this is the child logger debug message');
442
+ restartCustomWriter();
443
+ logger.info('this is the info message');
444
+ jsonObj = JSON.parse(output);
445
+ chai_1.assert.strictEqual(jsonObj.msg, 'this is the info message');
446
+ restartCustomWriter();
447
+ childLogger.info('this is the child logger info message');
448
+ jsonObj = JSON.parse(output);
449
+ chai_1.assert.strictEqual(jsonObj.msg, 'this is the child logger info message');
450
+ });
451
+ it('filter debug message when global log level set to WARNING', () => {
452
+ chai_1.assert.isTrue(general_utils_1.utils.isBlank(output));
453
+ logger_1.setGlobalLogLevel(logger_1.LogLevel.WARNING);
454
+ logger.debug('this is my filtered the debug message');
455
+ chai_1.assert.isTrue(general_utils_1.utils.isBlank(output), 'Did not filter debug message as expected.');
456
+ childLogger.debug('this is my filtered the debug message');
457
+ chai_1.assert.isTrue(general_utils_1.utils.isBlank(output), 'Did not filter debug message as expected.');
458
+ logger.info('this is my filtered the info message');
459
+ chai_1.assert.isTrue(general_utils_1.utils.isBlank(output), 'Did not filter info message as expected.');
460
+ childLogger.info('this is my filtered the info message');
461
+ chai_1.assert.isTrue(general_utils_1.utils.isBlank(output), 'Did not filter info message as expected.');
462
+ logger.warning('this is the warning message');
463
+ let jsonObj = JSON.parse(output);
464
+ chai_1.assert.strictEqual(jsonObj.msg, 'this is the warning message');
465
+ restartCustomWriter();
466
+ childLogger.warning('this is the child logger warning message');
467
+ jsonObj = JSON.parse(output);
468
+ chai_1.assert.strictEqual(jsonObj.msg, 'this is the child logger warning message');
469
+ });
470
+ it('apply current log level to new created logger - INFO', () => {
471
+ chai_1.assert.isTrue(general_utils_1.utils.isBlank(output));
472
+ logger_1.setGlobalLogLevel(logger_1.LogLevel.WARNING);
473
+ const newLogger = logger_1.createLogger('testing logger');
474
+ newLogger.info('this is the info message for newly created logger');
475
+ chai_1.assert.isTrue(general_utils_1.utils.isBlank(output), 'Did not filter info message as expected.');
476
+ newLogger.warning('this is the warning message');
477
+ const jsonObj = JSON.parse(output);
478
+ chai_1.assert.strictEqual(jsonObj.msg, 'this is the warning message');
479
+ });
480
+ });
481
+ });
482
+ describe('Log to file', function () {
483
+ timeout(this, 30000);
484
+ let loggerConfig;
485
+ let logger;
486
+ let testingLogDir;
487
+ let testingLogFile;
488
+ before(async () => {
489
+ testingLogDir = `${constants_1.constants.libRoot}/output/testingLogs`;
490
+ if (general_utils_1.utils.isDir(testingLogDir)) {
491
+ await general_utils_1.utils.clearDir(testingLogDir);
492
+ }
493
+ else {
494
+ fs.mkdirsSync(testingLogDir);
495
+ }
496
+ testingLogFile = `${testingLogDir}/application.log`;
497
+ });
498
+ after(async () => {
499
+ await general_utils_1.utils.deleteDir(testingLogDir);
500
+ });
501
+ beforeEach(async () => {
502
+ if (fs.existsSync(testingLogFile)) {
503
+ fs.unlinkSync(testingLogFile);
504
+ }
505
+ chai_1.assert.isFalse(fs.existsSync(testingLogFile));
506
+ });
507
+ /**
508
+ * Logging with Pino is asynchronous.
509
+ * We need to make sure the log is written to file by waiting.
510
+ * @see https://github.com/pinojs/pino/blob/master/docs/asynchronous.md
511
+ */
512
+ async function logAndWait(msg) {
513
+ logger.error(msg);
514
+ chai_1.assert.isFunction(logger[`pino`][`flush`], `The "flush method should exist on a Pino logger"`);
515
+ logger[`pino`][`flush`]();
516
+ const max = 5000;
517
+ let elapsed = 0;
518
+ const sleep = 200;
519
+ while (!fs.existsSync(testingLogFile) && elapsed < max) {
520
+ await general_utils_1.utils.sleep(sleep);
521
+ elapsed += sleep;
522
+ }
523
+ }
524
+ it('No log file - default', async () => {
525
+ loggerConfig = new configs_1.LoggerConfigs(() => TESTING_CID);
526
+ loggerConfig.setLogHumanReadableinConsole(false);
527
+ loggerConfig.setLogSource(true);
528
+ loggerConfig.setLogLevel(logger_1.LogLevel.DEBUG);
529
+ loggerConfig.setLogDirectory(testingLogDir);
530
+ logger_1.initLogger(loggerConfig, 'default', true);
531
+ logger = new logger_1.Logger('test');
532
+ await logAndWait('allo');
533
+ chai_1.assert.isFalse(fs.existsSync(testingLogFile));
534
+ });
535
+ it('No log file - explicit', async () => {
536
+ loggerConfig = new configs_1.LoggerConfigs(() => TESTING_CID);
537
+ loggerConfig.setLogHumanReadableinConsole(false);
538
+ loggerConfig.setLogSource(true);
539
+ loggerConfig.setLogLevel(logger_1.LogLevel.DEBUG);
540
+ loggerConfig.setLogDirectory(testingLogDir);
541
+ loggerConfig.setSlowerLogToFileToo(false);
542
+ logger_1.initLogger(loggerConfig, 'default', true);
543
+ logger = new logger_1.Logger('test');
544
+ await logAndWait('allo');
545
+ chai_1.assert.isFalse(fs.existsSync(testingLogFile));
546
+ });
547
+ it('Log file', async () => {
548
+ loggerConfig = new configs_1.LoggerConfigs(() => TESTING_CID);
549
+ loggerConfig.setLogHumanReadableinConsole(false);
550
+ loggerConfig.setLogSource(true);
551
+ loggerConfig.setLogLevel(logger_1.LogLevel.DEBUG);
552
+ loggerConfig.setLogDirectory(testingLogDir);
553
+ loggerConfig.setSlowerLogToFileToo(true);
554
+ logger_1.initLogger(loggerConfig, 'default', true);
555
+ logger = new logger_1.Logger('test');
556
+ await logAndWait('allo');
557
+ chai_1.assert.isTrue(fs.existsSync(testingLogFile));
558
+ const content = fs.readFileSync(testingLogFile, 'utf-8');
559
+ chai_1.assert.isOk(content);
560
+ chai_1.assert.isTrue(content.indexOf(`"msg":"allo"`) > -1);
561
+ });
562
+ });
563
+ });
564
+ //# sourceMappingURL=logger.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.test.js","sourceRoot":"","sources":["../../src/logger.test.ts"],"names":[],"mappings":"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"}