@muspellheim/shared 0.6.0 → 0.7.0
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/LICENSE.txt +1 -1
- package/README.md +11 -13
- package/dist/shared.d.ts +423 -0
- package/dist/shared.js +535 -0
- package/dist/shared.umd.cjs +1 -0
- package/package.json +27 -23
- package/.prettierignore +0 -3
- package/.prettierrc +0 -5
- package/deno.json +0 -15
- package/deno.mk +0 -68
- package/eslint.config.js +0 -23
- package/lib/assert.js +0 -15
- package/lib/browser/components.js +0 -165
- package/lib/browser/index.js +0 -3
- package/lib/color.js +0 -137
- package/lib/configurable-responses.js +0 -69
- package/lib/feature-toggle.js +0 -9
- package/lib/health.js +0 -510
- package/lib/index.js +0 -23
- package/lib/lang.js +0 -100
- package/lib/logging.js +0 -599
- package/lib/long-polling-client.js +0 -186
- package/lib/message-client.js +0 -68
- package/lib/messages.js +0 -68
- package/lib/metrics.js +0 -120
- package/lib/node/actuator-controller.js +0 -102
- package/lib/node/configuration-properties.js +0 -291
- package/lib/node/handler.js +0 -25
- package/lib/node/index.js +0 -9
- package/lib/node/logging.js +0 -60
- package/lib/node/long-polling.js +0 -83
- package/lib/node/sse-emitter.js +0 -104
- package/lib/node/static-files-controller.js +0 -15
- package/lib/output-tracker.js +0 -89
- package/lib/service-locator.js +0 -44
- package/lib/sse-client.js +0 -163
- package/lib/stop-watch.js +0 -54
- package/lib/store.js +0 -129
- package/lib/time.js +0 -445
- package/lib/util.js +0 -380
- package/lib/validation.js +0 -290
- package/lib/vector.js +0 -194
- package/lib/vitest/equality-testers.js +0 -19
- package/lib/vitest/index.js +0 -1
- package/lib/web-socket-client.js +0 -262
- package/tsconfig.json +0 -13
package/lib/logging.js
DELETED
|
@@ -1,599 +0,0 @@
|
|
|
1
|
-
// Copyright (c) 2023-2024 Falko Schumann. All rights reserved. MIT license.
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Provides the classes and interfaces of a logging facilities.
|
|
5
|
-
*
|
|
6
|
-
* Portated from
|
|
7
|
-
* [Java Logging](https://docs.oracle.com/en/java/javase/21/docs/api/java.logging/java/util/logging/package-summary.html).
|
|
8
|
-
*
|
|
9
|
-
* @module
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { OutputTracker } from './output-tracker.js';
|
|
13
|
-
|
|
14
|
-
const MESSAGE_LOGGED_EVENT = 'message-logged';
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Define a set of standard logging levels that can be used to control logging
|
|
18
|
-
* output.
|
|
19
|
-
*/
|
|
20
|
-
export class Level {
|
|
21
|
-
static #levels = [];
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* `OFF` is a special level that can be used to turn off logging.
|
|
25
|
-
*
|
|
26
|
-
* @type {Level}
|
|
27
|
-
*/
|
|
28
|
-
static OFF = new Level('OFF', Number.MAX_SAFE_INTEGER);
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* `ERROR` is a message level indicating a serious failure.
|
|
32
|
-
*
|
|
33
|
-
* @type {Level}
|
|
34
|
-
*/
|
|
35
|
-
static ERROR = new Level('ERROR', 1000);
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* `WARNING` is a message level indicating a potential problem.
|
|
39
|
-
*
|
|
40
|
-
* @type {Level}
|
|
41
|
-
*/
|
|
42
|
-
static WARNING = new Level('WARNING', 900);
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* `INFO` is a message level for informational messages.
|
|
46
|
-
*
|
|
47
|
-
* @type {Level}
|
|
48
|
-
*/
|
|
49
|
-
static INFO = new Level('INFO', 800);
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* `DEBUG` is a message level providing tracing information.
|
|
53
|
-
*
|
|
54
|
-
* @type {Level}
|
|
55
|
-
*/
|
|
56
|
-
static DEBUG = new Level('DEBUG', 700);
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* `TRACE` is a message level providing fine-grained tracing information.
|
|
60
|
-
*
|
|
61
|
-
* @type {Level}
|
|
62
|
-
*/
|
|
63
|
-
static TRACE = new Level('TRACE', 600);
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* `ALL` indicates that all messages should be logged.
|
|
67
|
-
*
|
|
68
|
-
* @type {Level}
|
|
69
|
-
*/
|
|
70
|
-
static ALL = new Level('ALL', Number.MIN_SAFE_INTEGER);
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Parses a level string or number into a Level.
|
|
74
|
-
*
|
|
75
|
-
* For example:
|
|
76
|
-
* - "ERROR"
|
|
77
|
-
* - "1000"
|
|
78
|
-
*
|
|
79
|
-
* @param {string|number} name The name or value of the level.
|
|
80
|
-
* @return The parsed value.
|
|
81
|
-
*/
|
|
82
|
-
static parse(name) {
|
|
83
|
-
const level = Level.#levels.find(
|
|
84
|
-
(level) => level.name === String(name) || level.value === Number(name),
|
|
85
|
-
);
|
|
86
|
-
if (level == null) {
|
|
87
|
-
throw new Error(`Bad log level "${name}".`);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
return level;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* The name of the level.
|
|
95
|
-
*
|
|
96
|
-
* @type {string}
|
|
97
|
-
*/
|
|
98
|
-
name;
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* The value of the level.
|
|
102
|
-
*
|
|
103
|
-
* @type {number}
|
|
104
|
-
*/
|
|
105
|
-
value;
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Initializes a new level and registers it.
|
|
109
|
-
*
|
|
110
|
-
* @param {string} name The name of the level.
|
|
111
|
-
* @param {number} value The value of the level.
|
|
112
|
-
*/
|
|
113
|
-
constructor(name, value) {
|
|
114
|
-
this.name = name;
|
|
115
|
-
this.value = value;
|
|
116
|
-
Level.#levels.push(this);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* Returns a string representation of the level.
|
|
121
|
-
*
|
|
122
|
-
* @return {string} The name of the level.
|
|
123
|
-
*/
|
|
124
|
-
toString() {
|
|
125
|
-
return this.name;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* Returns the value of the level.
|
|
130
|
-
*
|
|
131
|
-
* @return {number} The value of the level.
|
|
132
|
-
*/
|
|
133
|
-
valueOf() {
|
|
134
|
-
return this.value;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* Returns the name of the level.
|
|
139
|
-
*
|
|
140
|
-
* @return {string} The name of the level.
|
|
141
|
-
*/
|
|
142
|
-
toJSON() {
|
|
143
|
-
return this.name;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* A `Logger` object is used to log messages for a specific system or
|
|
149
|
-
* application component.
|
|
150
|
-
*/
|
|
151
|
-
export class Logger extends EventTarget {
|
|
152
|
-
/**
|
|
153
|
-
* Finds or creates a logger with the given name.
|
|
154
|
-
*
|
|
155
|
-
* @param {string} name The name of the logger.
|
|
156
|
-
* @return {Logger} The logger.
|
|
157
|
-
*/
|
|
158
|
-
static getLogger(name) {
|
|
159
|
-
const manager = LogManager.getLogManager();
|
|
160
|
-
return manager.demandLogger(name);
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
/**
|
|
164
|
-
* Creates a new logger without any handlers.
|
|
165
|
-
*
|
|
166
|
-
* @param {Object} options The options for the logger.
|
|
167
|
-
* @param {Level} options.level The level of the logger.
|
|
168
|
-
* @return {Logger} The logger.
|
|
169
|
-
*/
|
|
170
|
-
static getAnonymousLogger() {
|
|
171
|
-
const manager = LogManager.getLogManager();
|
|
172
|
-
const logger = new Logger(null);
|
|
173
|
-
logger.parent = manager.getLogger('');
|
|
174
|
-
return logger;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
/**
|
|
178
|
-
* The parent logger.
|
|
179
|
-
*
|
|
180
|
-
* The root logger has not a parent.
|
|
181
|
-
*
|
|
182
|
-
* @type {Logger=}
|
|
183
|
-
*/
|
|
184
|
-
parent;
|
|
185
|
-
|
|
186
|
-
/**
|
|
187
|
-
* The level of the logger.
|
|
188
|
-
*
|
|
189
|
-
* If the level is not set, it will use the level of the parent logger.
|
|
190
|
-
*
|
|
191
|
-
* @type {?Level}
|
|
192
|
-
*/
|
|
193
|
-
level;
|
|
194
|
-
|
|
195
|
-
/**
|
|
196
|
-
* @type {Handler[]}
|
|
197
|
-
*/
|
|
198
|
-
#handlers = [];
|
|
199
|
-
|
|
200
|
-
#name;
|
|
201
|
-
|
|
202
|
-
/**
|
|
203
|
-
* Initializes a new logger with the given name.
|
|
204
|
-
*
|
|
205
|
-
* @param {?string} name The name of the logger.
|
|
206
|
-
*/
|
|
207
|
-
constructor(name) {
|
|
208
|
-
super();
|
|
209
|
-
this.#name = name;
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
/**
|
|
213
|
-
* The name of the logger.
|
|
214
|
-
*
|
|
215
|
-
* @type {?string}
|
|
216
|
-
*/
|
|
217
|
-
get name() {
|
|
218
|
-
return this.#name;
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
/**
|
|
222
|
-
* Logs a message with the `ERROR` level.
|
|
223
|
-
*
|
|
224
|
-
* @param {...*} message The message to log.
|
|
225
|
-
*/
|
|
226
|
-
error(...message) {
|
|
227
|
-
this.log(Level.ERROR, ...message);
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
/**
|
|
231
|
-
* Logs a message with the `WARNING` level.
|
|
232
|
-
*
|
|
233
|
-
* @param {...*} message The message to log.
|
|
234
|
-
*/
|
|
235
|
-
warning(...message) {
|
|
236
|
-
this.log(Level.WARNING, ...message);
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
/**
|
|
240
|
-
* Logs a message with the `INFO` level.
|
|
241
|
-
*
|
|
242
|
-
* @param {...*} message The message to log.
|
|
243
|
-
*/
|
|
244
|
-
info(...message) {
|
|
245
|
-
this.log(Level.INFO, ...message);
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
/**
|
|
249
|
-
* Logs a message with the `DEBUG` level.
|
|
250
|
-
*
|
|
251
|
-
* @param {...*} message The message to log.
|
|
252
|
-
*/
|
|
253
|
-
debug(...message) {
|
|
254
|
-
this.log(Level.DEBUG, ...message);
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
/**
|
|
258
|
-
* Logs a message with the `TRACE` level.
|
|
259
|
-
*
|
|
260
|
-
* @param {...*} message The message to log.
|
|
261
|
-
*/
|
|
262
|
-
|
|
263
|
-
trace(...message) {
|
|
264
|
-
this.log(Level.TRACE, ...message);
|
|
265
|
-
}
|
|
266
|
-
/**
|
|
267
|
-
* Logs a message.
|
|
268
|
-
*
|
|
269
|
-
* @param {Level} level The level of the message.
|
|
270
|
-
* @param {...*} message The message to log.
|
|
271
|
-
*/
|
|
272
|
-
log(level, ...message) {
|
|
273
|
-
if (!this.isLoggable(level)) {
|
|
274
|
-
return;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
const record = new LogRecord(level, ...message);
|
|
278
|
-
record.loggerName = this.name;
|
|
279
|
-
this.#handlers.forEach((handler) => handler.publish(record));
|
|
280
|
-
let logger = this.parent;
|
|
281
|
-
while (logger != null) {
|
|
282
|
-
logger.#handlers.forEach((handler) => handler.publish(record));
|
|
283
|
-
logger = logger.parent;
|
|
284
|
-
}
|
|
285
|
-
this.dispatchEvent(
|
|
286
|
-
new CustomEvent(MESSAGE_LOGGED_EVENT, { detail: record }),
|
|
287
|
-
);
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
/**
|
|
291
|
-
* Returns an output tracker for messages logged by this logger.
|
|
292
|
-
*
|
|
293
|
-
* @return {OutputTracker} The output tracker.
|
|
294
|
-
*/
|
|
295
|
-
trackMessagesLogged() {
|
|
296
|
-
return new OutputTracker(this, MESSAGE_LOGGED_EVENT);
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
/**
|
|
300
|
-
* Checks if a message of the given level would actually be logged by this
|
|
301
|
-
* logger.
|
|
302
|
-
*
|
|
303
|
-
* @param {Level} level The level to check.
|
|
304
|
-
* @return {boolean} `true` if the message would be logged.
|
|
305
|
-
*/
|
|
306
|
-
isLoggable(level) {
|
|
307
|
-
return this.level != null
|
|
308
|
-
? level >= this.level
|
|
309
|
-
: (this.parent?.isLoggable(level) ?? false);
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
/**
|
|
313
|
-
* Adds a log handler to receive logging messages.
|
|
314
|
-
*
|
|
315
|
-
* @param {Handler} handler The handler to add.
|
|
316
|
-
*/
|
|
317
|
-
addHandler(handler) {
|
|
318
|
-
this.#handlers.push(handler);
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
/**
|
|
322
|
-
* Removes a log handler.
|
|
323
|
-
*
|
|
324
|
-
* @param {Handler} handler The handler to remove.
|
|
325
|
-
*/
|
|
326
|
-
removeHandler(handler) {
|
|
327
|
-
this.#handlers = this.#handlers.filter((h) => h !== handler);
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
/**
|
|
331
|
-
* Returns the handlers of the logger.
|
|
332
|
-
*
|
|
333
|
-
* @return {Handler[]} The handlers of the logger.
|
|
334
|
-
*/
|
|
335
|
-
getHandlers() {
|
|
336
|
-
return Array.from(this.#handlers);
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
/**
|
|
341
|
-
* A `LogRecord` object is used to pass logging requests between the logging
|
|
342
|
-
* framework and individual log handlers.
|
|
343
|
-
*/
|
|
344
|
-
export class LogRecord {
|
|
345
|
-
static #globalSequenceNumber = 1;
|
|
346
|
-
|
|
347
|
-
/**
|
|
348
|
-
* The timestamp when the log record was created.
|
|
349
|
-
*
|
|
350
|
-
* @type {Date}
|
|
351
|
-
*/
|
|
352
|
-
date;
|
|
353
|
-
|
|
354
|
-
/**
|
|
355
|
-
* The sequence number of the log record.
|
|
356
|
-
*
|
|
357
|
-
* @type {number}
|
|
358
|
-
*/
|
|
359
|
-
sequenceNumber;
|
|
360
|
-
|
|
361
|
-
/**
|
|
362
|
-
* The log level.
|
|
363
|
-
*
|
|
364
|
-
* @type {Level}
|
|
365
|
-
*/
|
|
366
|
-
level;
|
|
367
|
-
|
|
368
|
-
/**
|
|
369
|
-
* The log message.
|
|
370
|
-
*
|
|
371
|
-
* @type {Array}
|
|
372
|
-
*/
|
|
373
|
-
message;
|
|
374
|
-
|
|
375
|
-
/**
|
|
376
|
-
* The name of the logger.
|
|
377
|
-
*
|
|
378
|
-
* @type {string|null}
|
|
379
|
-
*/
|
|
380
|
-
loggerName;
|
|
381
|
-
|
|
382
|
-
/**
|
|
383
|
-
* Initializes a new log record.
|
|
384
|
-
*
|
|
385
|
-
* @param {Level} level The level of the log record.
|
|
386
|
-
* @param {...*} message The message to log.
|
|
387
|
-
*/
|
|
388
|
-
constructor(level, ...message) {
|
|
389
|
-
this.date = new Date();
|
|
390
|
-
this.sequenceNumber = LogRecord.#globalSequenceNumber++;
|
|
391
|
-
this.level = level;
|
|
392
|
-
this.message = message;
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
/**
|
|
396
|
-
* Returns the timestamp of the log record in milliseconds.
|
|
397
|
-
*
|
|
398
|
-
* @type {number}
|
|
399
|
-
* @readonly
|
|
400
|
-
*/
|
|
401
|
-
get millis() {
|
|
402
|
-
return this.date.getTime();
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
/**
|
|
407
|
-
* A `Handler` object takes log messages from a Logger and exports them.
|
|
408
|
-
*/
|
|
409
|
-
export class Handler {
|
|
410
|
-
/**
|
|
411
|
-
* The log level which messages will be logged by this `Handler`.
|
|
412
|
-
*
|
|
413
|
-
* @type {Level}
|
|
414
|
-
*/
|
|
415
|
-
level = Level.ALL;
|
|
416
|
-
|
|
417
|
-
/**
|
|
418
|
-
* The formatter used to format log records.
|
|
419
|
-
*
|
|
420
|
-
* @type {Formatter}
|
|
421
|
-
*/
|
|
422
|
-
formatter;
|
|
423
|
-
|
|
424
|
-
/**
|
|
425
|
-
* Publishes a `LogRecord`.
|
|
426
|
-
*
|
|
427
|
-
* @param {LogRecord} record The log record to publish.
|
|
428
|
-
* @abstract
|
|
429
|
-
*/
|
|
430
|
-
async publish(_record) {
|
|
431
|
-
await Promise.reject('Not implemented');
|
|
432
|
-
}
|
|
433
|
-
|
|
434
|
-
/**
|
|
435
|
-
* Checks if this handler would actually log a given `LogRecord`.
|
|
436
|
-
*
|
|
437
|
-
* @param {Level} level The level to check.
|
|
438
|
-
* @return {boolean} `true` if the message would be logged.
|
|
439
|
-
*/
|
|
440
|
-
isLoggable(level) {
|
|
441
|
-
return level >= this.level;
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
/**
|
|
446
|
-
* A `Handler` that writes log messages to the console.
|
|
447
|
-
*
|
|
448
|
-
* @extends Handler
|
|
449
|
-
*/
|
|
450
|
-
export class ConsoleHandler extends Handler {
|
|
451
|
-
/** @override */
|
|
452
|
-
async publish(/** @type {LogRecord} */ record) {
|
|
453
|
-
if (!this.isLoggable(record.level)) {
|
|
454
|
-
return;
|
|
455
|
-
}
|
|
456
|
-
|
|
457
|
-
const message = this.formatter.format(record);
|
|
458
|
-
switch (record.level) {
|
|
459
|
-
case Level.ERROR:
|
|
460
|
-
console.error(message);
|
|
461
|
-
break;
|
|
462
|
-
case Level.WARNING:
|
|
463
|
-
console.warn(message);
|
|
464
|
-
break;
|
|
465
|
-
case Level.INFO:
|
|
466
|
-
console.info(message);
|
|
467
|
-
break;
|
|
468
|
-
case Level.DEBUG:
|
|
469
|
-
console.debug(message);
|
|
470
|
-
break;
|
|
471
|
-
case Level.TRACE:
|
|
472
|
-
console.trace(message);
|
|
473
|
-
break;
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
await Promise.resolve();
|
|
477
|
-
}
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
/**
|
|
481
|
-
* A `Formatter` provides support for formatting log records.
|
|
482
|
-
*/
|
|
483
|
-
export class Formatter {
|
|
484
|
-
/**
|
|
485
|
-
* Formats the given log record and return the formatted string.
|
|
486
|
-
*
|
|
487
|
-
* @param {LogRecord} record The log record to format.
|
|
488
|
-
* @return {string} The formatted log record.
|
|
489
|
-
* @abstract
|
|
490
|
-
*/
|
|
491
|
-
format(_record) {
|
|
492
|
-
throw new Error('Not implemented');
|
|
493
|
-
}
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
/**
|
|
497
|
-
* Print a brief summary of the `LogRecord` in a human readable format.
|
|
498
|
-
*
|
|
499
|
-
* @implements {Formatter}
|
|
500
|
-
*/
|
|
501
|
-
export class SimpleFormatter extends Formatter {
|
|
502
|
-
/** @override */
|
|
503
|
-
format(/** @type {LogRecord} */ record) {
|
|
504
|
-
let s = record.date.toISOString();
|
|
505
|
-
if (record.loggerName) {
|
|
506
|
-
s += ' [' + record.loggerName + ']';
|
|
507
|
-
}
|
|
508
|
-
s += ' ' + record.level.toString();
|
|
509
|
-
s +=
|
|
510
|
-
' - ' +
|
|
511
|
-
record.message
|
|
512
|
-
.map((m) => (typeof m === 'object' ? JSON.stringify(m) : m))
|
|
513
|
-
.join(' ');
|
|
514
|
-
return s;
|
|
515
|
-
}
|
|
516
|
-
}
|
|
517
|
-
|
|
518
|
-
/**
|
|
519
|
-
* Format a `LogRecord` into a JSON object.
|
|
520
|
-
*
|
|
521
|
-
* The JSON object has the following properties:
|
|
522
|
-
* - `date`: string
|
|
523
|
-
* - `millis`: number
|
|
524
|
-
* - `sequence`: number
|
|
525
|
-
* - `logger`: string (optional)
|
|
526
|
-
* - `level`: string
|
|
527
|
-
* - `message`: string
|
|
528
|
-
*
|
|
529
|
-
* @implements {Formatter}
|
|
530
|
-
*/
|
|
531
|
-
export class JsonFormatter extends Formatter {
|
|
532
|
-
/** @override */
|
|
533
|
-
format(/** @type {LogRecord} */ record) {
|
|
534
|
-
const data = {
|
|
535
|
-
date: record.date.toISOString(),
|
|
536
|
-
millis: record.millis,
|
|
537
|
-
sequence: record.sequenceNumber,
|
|
538
|
-
logger: record.loggerName,
|
|
539
|
-
level: record.level.toString(),
|
|
540
|
-
message: record.message
|
|
541
|
-
.map((m) => (typeof m === 'object' ? JSON.stringify(m) : m))
|
|
542
|
-
.join(' '),
|
|
543
|
-
};
|
|
544
|
-
return JSON.stringify(data);
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
|
|
548
|
-
class LogManager {
|
|
549
|
-
/** @type {LogManager} */ static #logManager;
|
|
550
|
-
|
|
551
|
-
/** @type {Map<string, Logger>} */ #namedLoggers = new Map();
|
|
552
|
-
/** @type {Logger} */ #rootLogger;
|
|
553
|
-
|
|
554
|
-
static getLogManager() {
|
|
555
|
-
if (!LogManager.#logManager) {
|
|
556
|
-
LogManager.#logManager = new LogManager();
|
|
557
|
-
}
|
|
558
|
-
|
|
559
|
-
return LogManager.#logManager;
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
constructor() {
|
|
563
|
-
this.#rootLogger = this.#createRootLogger();
|
|
564
|
-
}
|
|
565
|
-
|
|
566
|
-
demandLogger(/** @type {string} */ name) {
|
|
567
|
-
let logger = this.getLogger(name);
|
|
568
|
-
if (logger == null) {
|
|
569
|
-
logger = this.#createLogger(name);
|
|
570
|
-
}
|
|
571
|
-
return logger;
|
|
572
|
-
}
|
|
573
|
-
|
|
574
|
-
addLogger(/** @type {Logger} */ logger) {
|
|
575
|
-
const loggerName = logger.name;
|
|
576
|
-
this.#namedLoggers.set(loggerName, logger);
|
|
577
|
-
}
|
|
578
|
-
|
|
579
|
-
getLogger(/** @type {string} */ name) {
|
|
580
|
-
return this.#namedLoggers.get(name);
|
|
581
|
-
}
|
|
582
|
-
|
|
583
|
-
#createRootLogger() {
|
|
584
|
-
const logger = new Logger('');
|
|
585
|
-
logger.level = Level.INFO;
|
|
586
|
-
const handler = new ConsoleHandler();
|
|
587
|
-
handler.formatter = new SimpleFormatter();
|
|
588
|
-
logger.addHandler(handler);
|
|
589
|
-
this.addLogger(logger);
|
|
590
|
-
return logger;
|
|
591
|
-
}
|
|
592
|
-
|
|
593
|
-
#createLogger(/** @type {string} */ name) {
|
|
594
|
-
const logger = new Logger(name);
|
|
595
|
-
logger.parent = this.#rootLogger;
|
|
596
|
-
this.addLogger(logger);
|
|
597
|
-
return logger;
|
|
598
|
-
}
|
|
599
|
-
}
|