@logtape/logtape 2.2.0-dev.759 → 2.2.0-dev.761
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/context.cjs +13 -8
- package/dist/context.d.cts.map +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +13 -8
- package/dist/context.js.map +1 -1
- package/dist/formatter.cjs +26 -25
- package/dist/formatter.d.cts.map +1 -1
- package/dist/formatter.d.ts.map +1 -1
- package/dist/formatter.js +26 -25
- package/dist/formatter.js.map +1 -1
- package/dist/logger.cjs +158 -20
- package/dist/logger.d.cts.map +1 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +159 -21
- package/dist/logger.js.map +1 -1
- package/dist/sink.cjs +6 -1
- package/dist/sink.d.cts.map +1 -1
- package/dist/sink.d.ts.map +1 -1
- package/dist/sink.js +6 -1
- package/dist/sink.js.map +1 -1
- package/package.json +1 -1
package/dist/logger.cjs
CHANGED
|
@@ -7,6 +7,9 @@ const require_level = require('./level.cjs');
|
|
|
7
7
|
*/
|
|
8
8
|
const lazySymbol = Symbol.for("logtape.lazy");
|
|
9
9
|
const throttlingSummaryRecordSymbol = Symbol.for("LogTape.throttlingSummaryRecord");
|
|
10
|
+
const immediateSinkSymbol = Symbol.for("LogTape.sinkSnapshotPolicy.immediate");
|
|
11
|
+
const internalStringLogRecords = /* @__PURE__ */ new WeakSet();
|
|
12
|
+
const resolvedStringLogRecords = /* @__PURE__ */ new WeakSet();
|
|
10
13
|
/**
|
|
11
14
|
* Checks if a value is a lazy value.
|
|
12
15
|
*
|
|
@@ -82,7 +85,18 @@ function logStringMessage(logger, level, message, props) {
|
|
|
82
85
|
logger.log(level, message, result);
|
|
83
86
|
}
|
|
84
87
|
function snapshotLogRecordProperties(record) {
|
|
88
|
+
if (resolvedStringLogRecords.has(record)) return record;
|
|
85
89
|
const properties = resolveProperties(record.properties);
|
|
90
|
+
if (internalStringLogRecords.has(record)) return {
|
|
91
|
+
category: record.category,
|
|
92
|
+
level: record.level,
|
|
93
|
+
get message() {
|
|
94
|
+
return record.message;
|
|
95
|
+
},
|
|
96
|
+
rawMessage: record.rawMessage,
|
|
97
|
+
timestamp: record.timestamp,
|
|
98
|
+
properties
|
|
99
|
+
};
|
|
86
100
|
const descriptors = Object.getOwnPropertyDescriptors(record);
|
|
87
101
|
descriptors.properties = {
|
|
88
102
|
value: properties,
|
|
@@ -91,6 +105,13 @@ function snapshotLogRecordProperties(record) {
|
|
|
91
105
|
};
|
|
92
106
|
return Object.defineProperties({}, descriptors);
|
|
93
107
|
}
|
|
108
|
+
function hasEnumerableProperties(properties) {
|
|
109
|
+
if (properties == null || typeof properties !== "object") return false;
|
|
110
|
+
return Object.keys(properties).length > 0 || Object.prototype.propertyIsEnumerable.call(properties, throttlingSummaryRecordSymbol);
|
|
111
|
+
}
|
|
112
|
+
function shouldSnapshotForSink(sink) {
|
|
113
|
+
return sink[immediateSinkSymbol] !== true;
|
|
114
|
+
}
|
|
94
115
|
/**
|
|
95
116
|
* Get a logger with the given category.
|
|
96
117
|
*
|
|
@@ -122,10 +143,11 @@ var LoggerImpl = class LoggerImpl {
|
|
|
122
143
|
children;
|
|
123
144
|
category;
|
|
124
145
|
sinks;
|
|
125
|
-
parentSinks = "inherit";
|
|
126
146
|
filters;
|
|
127
|
-
lowestLevel = "trace";
|
|
128
147
|
contextLocalStorage;
|
|
148
|
+
#parentSinks = "inherit";
|
|
149
|
+
#lowestLevel = "trace";
|
|
150
|
+
#sinkPlanCache = {};
|
|
129
151
|
static getLogger(category = []) {
|
|
130
152
|
let rootLogger = globalRootLoggerSymbol in globalThis ? globalThis[globalRootLoggerSymbol] ?? null : null;
|
|
131
153
|
if (rootLogger == null) {
|
|
@@ -153,6 +175,20 @@ var LoggerImpl = class LoggerImpl {
|
|
|
153
175
|
this.sinks = [];
|
|
154
176
|
this.filters = [];
|
|
155
177
|
}
|
|
178
|
+
get parentSinks() {
|
|
179
|
+
return this.#parentSinks;
|
|
180
|
+
}
|
|
181
|
+
set parentSinks(value) {
|
|
182
|
+
if (this.#parentSinks === value) return;
|
|
183
|
+
this.#parentSinks = value;
|
|
184
|
+
}
|
|
185
|
+
get lowestLevel() {
|
|
186
|
+
return this.#lowestLevel;
|
|
187
|
+
}
|
|
188
|
+
set lowestLevel(value) {
|
|
189
|
+
if (this.#lowestLevel === value) return;
|
|
190
|
+
this.#lowestLevel = value;
|
|
191
|
+
}
|
|
156
192
|
getChild(subcategory) {
|
|
157
193
|
const name = typeof subcategory === "string" ? subcategory : subcategory[0];
|
|
158
194
|
const childRef = this.children[name];
|
|
@@ -193,9 +229,72 @@ var LoggerImpl = class LoggerImpl {
|
|
|
193
229
|
return true;
|
|
194
230
|
}
|
|
195
231
|
*getSinks(level) {
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
232
|
+
const plan = this.getSinkDispatchPlan(level);
|
|
233
|
+
switch (plan.kind) {
|
|
234
|
+
case "none": return;
|
|
235
|
+
case "one":
|
|
236
|
+
yield plan.sink;
|
|
237
|
+
return;
|
|
238
|
+
case "many":
|
|
239
|
+
yield* plan.sinks;
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
getSinkDispatchPlan(level) {
|
|
244
|
+
const cached = this.#sinkPlanCache[level];
|
|
245
|
+
if (cached != null && this.isSinkDispatchPlanFresh(level, cached)) return cached;
|
|
246
|
+
const parentPlan = this.parent != null && this.parentSinks === "inherit" ? this.parent.getSinkDispatchPlan(level) : void 0;
|
|
247
|
+
const plan = this.createSinkDispatchPlan(level, parentPlan);
|
|
248
|
+
this.#sinkPlanCache[level] = plan;
|
|
249
|
+
return plan;
|
|
250
|
+
}
|
|
251
|
+
isSinkDispatchPlanFresh(level, plan) {
|
|
252
|
+
if (plan.lowestLevel !== this.lowestLevel || plan.parentSinks !== this.parentSinks || plan.localSinks.length !== this.sinks.length) return false;
|
|
253
|
+
for (let i = 0; i < plan.localSinks.length; i++) if (plan.localSinks[i] !== this.sinks[i]) return false;
|
|
254
|
+
const parentPlan = this.parent != null && this.parentSinks === "inherit" ? this.parent.getSinkDispatchPlan(level) : void 0;
|
|
255
|
+
return plan.parentPlan === parentPlan;
|
|
256
|
+
}
|
|
257
|
+
createSinkDispatchPlan(level, parentPlan) {
|
|
258
|
+
const state = {
|
|
259
|
+
localSinks: [...this.sinks],
|
|
260
|
+
parentSinks: this.parentSinks,
|
|
261
|
+
lowestLevel: this.lowestLevel,
|
|
262
|
+
parentPlan
|
|
263
|
+
};
|
|
264
|
+
if (state.lowestLevel === null) return {
|
|
265
|
+
...state,
|
|
266
|
+
kind: "none"
|
|
267
|
+
};
|
|
268
|
+
if (require_level.compareLogLevel(level, state.lowestLevel) < 0) return {
|
|
269
|
+
...state,
|
|
270
|
+
kind: "none"
|
|
271
|
+
};
|
|
272
|
+
let firstSink;
|
|
273
|
+
let sinks;
|
|
274
|
+
const appendSink = (sink) => {
|
|
275
|
+
if (sinks != null) sinks.push(sink);
|
|
276
|
+
else if (firstSink == null) firstSink = sink;
|
|
277
|
+
else sinks = [firstSink, sink];
|
|
278
|
+
};
|
|
279
|
+
if (parentPlan != null) {
|
|
280
|
+
if (parentPlan.kind === "one") firstSink = parentPlan.sink;
|
|
281
|
+
else if (parentPlan.kind === "many") sinks = [...parentPlan.sinks];
|
|
282
|
+
}
|
|
283
|
+
for (const sink of state.localSinks) appendSink(sink);
|
|
284
|
+
if (sinks != null) return {
|
|
285
|
+
...state,
|
|
286
|
+
kind: "many",
|
|
287
|
+
sinks
|
|
288
|
+
};
|
|
289
|
+
if (firstSink != null) return {
|
|
290
|
+
...state,
|
|
291
|
+
kind: "one",
|
|
292
|
+
sink: firstSink
|
|
293
|
+
};
|
|
294
|
+
return {
|
|
295
|
+
...state,
|
|
296
|
+
kind: "none"
|
|
297
|
+
};
|
|
199
298
|
}
|
|
200
299
|
isEnabledFor(level) {
|
|
201
300
|
const categoryPrefix = isMetaLoggerCategory(this.category) ? [] : require_context.getCategoryPrefix();
|
|
@@ -203,14 +302,17 @@ var LoggerImpl = class LoggerImpl {
|
|
|
203
302
|
return dispatcher.isEnabledForResolved(level);
|
|
204
303
|
}
|
|
205
304
|
isEnabledForResolved(level) {
|
|
206
|
-
|
|
207
|
-
for (const _ of this.getSinks(level)) return true;
|
|
208
|
-
return false;
|
|
305
|
+
return this.getSinkDispatchPlan(level).kind !== "none";
|
|
209
306
|
}
|
|
210
307
|
emit(record, bypassSinks) {
|
|
211
|
-
const
|
|
308
|
+
const hasCategory = "category" in record;
|
|
309
|
+
const baseCategory = hasCategory ? record.category : this.category;
|
|
212
310
|
const categoryPrefix = isMetaLoggerCategory(baseCategory) ? [] : require_context.getCategoryPrefix();
|
|
213
311
|
const fullCategory = categoryPrefix.length > 0 ? [...categoryPrefix, ...baseCategory] : baseCategory;
|
|
312
|
+
if (categoryPrefix.length < 1 && Object.prototype.hasOwnProperty.call(record, "category")) {
|
|
313
|
+
this.emitResolved(record, bypassSinks);
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
214
316
|
const descriptors = Object.getOwnPropertyDescriptors(record);
|
|
215
317
|
descriptors.category = {
|
|
216
318
|
value: fullCategory,
|
|
@@ -223,14 +325,36 @@ var LoggerImpl = class LoggerImpl {
|
|
|
223
325
|
}
|
|
224
326
|
emitResolved(record, bypassSinks) {
|
|
225
327
|
if (this.lowestLevel === null || require_level.compareLogLevel(record.level, this.lowestLevel) < 0 || !this.filter(record)) return;
|
|
226
|
-
const
|
|
227
|
-
if (
|
|
328
|
+
const plan = this.getSinkDispatchPlan(record.level);
|
|
329
|
+
if (plan.kind === "none") return;
|
|
228
330
|
let snapshot;
|
|
229
331
|
let snapshotFailed = false;
|
|
230
|
-
|
|
332
|
+
if (plan.kind === "one") {
|
|
333
|
+
const sink = plan.sink;
|
|
334
|
+
if (bypassSinks?.has(sink)) return;
|
|
335
|
+
try {
|
|
336
|
+
if (shouldSnapshotForSink(sink)) try {
|
|
337
|
+
snapshot = snapshotLogRecordProperties(record);
|
|
338
|
+
} catch {
|
|
339
|
+
snapshotFailed = true;
|
|
340
|
+
snapshot = record;
|
|
341
|
+
}
|
|
342
|
+
sink(snapshot ?? record);
|
|
343
|
+
} catch (error) {
|
|
344
|
+
const bypassSinks2 = new Set(bypassSinks);
|
|
345
|
+
bypassSinks2.add(sink);
|
|
346
|
+
metaLogger.log("fatal", "Failed to emit a log record to sink {sink}: {error}", {
|
|
347
|
+
sink,
|
|
348
|
+
error,
|
|
349
|
+
record
|
|
350
|
+
}, bypassSinks2);
|
|
351
|
+
}
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
for (const sink of plan.sinks) {
|
|
231
355
|
if (bypassSinks?.has(sink)) continue;
|
|
232
356
|
try {
|
|
233
|
-
if (snapshot == null && !snapshotFailed) try {
|
|
357
|
+
if (snapshot == null && !snapshotFailed && shouldSnapshotForSink(sink)) try {
|
|
234
358
|
snapshot = snapshotLogRecordProperties(record);
|
|
235
359
|
} catch {
|
|
236
360
|
snapshotFailed = true;
|
|
@@ -249,7 +373,20 @@ var LoggerImpl = class LoggerImpl {
|
|
|
249
373
|
}
|
|
250
374
|
}
|
|
251
375
|
log(level, rawMessage, properties, bypassSinks) {
|
|
252
|
-
const implicitContext = require_context.
|
|
376
|
+
const implicitContext = require_context.getImplicitContextIfAny();
|
|
377
|
+
if (typeof properties !== "function" && implicitContext == null && !rawMessage.includes("{") && !hasEnumerableProperties(properties)) {
|
|
378
|
+
const record$1 = {
|
|
379
|
+
category: this.category,
|
|
380
|
+
level,
|
|
381
|
+
message: [rawMessage],
|
|
382
|
+
rawMessage,
|
|
383
|
+
timestamp: Date.now(),
|
|
384
|
+
properties: {}
|
|
385
|
+
};
|
|
386
|
+
resolvedStringLogRecords.add(record$1);
|
|
387
|
+
this.emit(record$1, bypassSinks);
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
253
390
|
let cachedProps = void 0;
|
|
254
391
|
let cachedMessage = void 0;
|
|
255
392
|
const record = typeof properties === "function" ? {
|
|
@@ -263,7 +400,7 @@ var LoggerImpl = class LoggerImpl {
|
|
|
263
400
|
rawMessage,
|
|
264
401
|
get properties() {
|
|
265
402
|
if (cachedProps == null) cachedProps = resolveProperties({
|
|
266
|
-
...implicitContext,
|
|
403
|
+
...implicitContext ?? {},
|
|
267
404
|
...properties()
|
|
268
405
|
});
|
|
269
406
|
return cachedProps;
|
|
@@ -279,16 +416,17 @@ var LoggerImpl = class LoggerImpl {
|
|
|
279
416
|
rawMessage,
|
|
280
417
|
get properties() {
|
|
281
418
|
if (cachedProps == null) cachedProps = resolveProperties({
|
|
282
|
-
...implicitContext,
|
|
419
|
+
...implicitContext ?? {},
|
|
283
420
|
...properties
|
|
284
421
|
});
|
|
285
422
|
return cachedProps;
|
|
286
423
|
}
|
|
287
424
|
};
|
|
425
|
+
internalStringLogRecords.add(record);
|
|
288
426
|
this.emit(record, bypassSinks);
|
|
289
427
|
}
|
|
290
428
|
logLazily(level, callback, properties = {}) {
|
|
291
|
-
const implicitContext = require_context.
|
|
429
|
+
const implicitContext = require_context.getImplicitContextIfAny();
|
|
292
430
|
let rawMessage = void 0;
|
|
293
431
|
let msg = void 0;
|
|
294
432
|
function realizeMessage() {
|
|
@@ -312,13 +450,13 @@ var LoggerImpl = class LoggerImpl {
|
|
|
312
450
|
},
|
|
313
451
|
timestamp: Date.now(),
|
|
314
452
|
properties: {
|
|
315
|
-
...implicitContext,
|
|
453
|
+
...implicitContext ?? {},
|
|
316
454
|
...properties
|
|
317
455
|
}
|
|
318
456
|
});
|
|
319
457
|
}
|
|
320
458
|
logTemplate(level, messageTemplate, values, properties = {}) {
|
|
321
|
-
const implicitContext = require_context.
|
|
459
|
+
const implicitContext = require_context.getImplicitContextIfAny();
|
|
322
460
|
this.emit({
|
|
323
461
|
category: this.category,
|
|
324
462
|
level,
|
|
@@ -326,7 +464,7 @@ var LoggerImpl = class LoggerImpl {
|
|
|
326
464
|
rawMessage: messageTemplate,
|
|
327
465
|
timestamp: Date.now(),
|
|
328
466
|
properties: {
|
|
329
|
-
...implicitContext,
|
|
467
|
+
...implicitContext ?? {},
|
|
330
468
|
...properties
|
|
331
469
|
}
|
|
332
470
|
});
|
package/dist/logger.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.cts","names":[],"sources":["../src/logger.ts"],"sourcesContent":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"logger.d.cts","names":[],"sources":["../src/logger.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/logger.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","names":[],"sources":["../src/logger.ts"],"sourcesContent":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"logger.d.ts","names":[],"sources":["../src/logger.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/logger.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getCategoryPrefix,
|
|
1
|
+
import { getCategoryPrefix, getImplicitContextIfAny } from "./context.js";
|
|
2
2
|
import { compareLogLevel } from "./level.js";
|
|
3
3
|
|
|
4
4
|
//#region src/logger.ts
|
|
@@ -7,6 +7,9 @@ import { compareLogLevel } from "./level.js";
|
|
|
7
7
|
*/
|
|
8
8
|
const lazySymbol = Symbol.for("logtape.lazy");
|
|
9
9
|
const throttlingSummaryRecordSymbol = Symbol.for("LogTape.throttlingSummaryRecord");
|
|
10
|
+
const immediateSinkSymbol = Symbol.for("LogTape.sinkSnapshotPolicy.immediate");
|
|
11
|
+
const internalStringLogRecords = /* @__PURE__ */ new WeakSet();
|
|
12
|
+
const resolvedStringLogRecords = /* @__PURE__ */ new WeakSet();
|
|
10
13
|
/**
|
|
11
14
|
* Checks if a value is a lazy value.
|
|
12
15
|
*
|
|
@@ -82,7 +85,18 @@ function logStringMessage(logger, level, message, props) {
|
|
|
82
85
|
logger.log(level, message, result);
|
|
83
86
|
}
|
|
84
87
|
function snapshotLogRecordProperties(record) {
|
|
88
|
+
if (resolvedStringLogRecords.has(record)) return record;
|
|
85
89
|
const properties = resolveProperties(record.properties);
|
|
90
|
+
if (internalStringLogRecords.has(record)) return {
|
|
91
|
+
category: record.category,
|
|
92
|
+
level: record.level,
|
|
93
|
+
get message() {
|
|
94
|
+
return record.message;
|
|
95
|
+
},
|
|
96
|
+
rawMessage: record.rawMessage,
|
|
97
|
+
timestamp: record.timestamp,
|
|
98
|
+
properties
|
|
99
|
+
};
|
|
86
100
|
const descriptors = Object.getOwnPropertyDescriptors(record);
|
|
87
101
|
descriptors.properties = {
|
|
88
102
|
value: properties,
|
|
@@ -91,6 +105,13 @@ function snapshotLogRecordProperties(record) {
|
|
|
91
105
|
};
|
|
92
106
|
return Object.defineProperties({}, descriptors);
|
|
93
107
|
}
|
|
108
|
+
function hasEnumerableProperties(properties) {
|
|
109
|
+
if (properties == null || typeof properties !== "object") return false;
|
|
110
|
+
return Object.keys(properties).length > 0 || Object.prototype.propertyIsEnumerable.call(properties, throttlingSummaryRecordSymbol);
|
|
111
|
+
}
|
|
112
|
+
function shouldSnapshotForSink(sink) {
|
|
113
|
+
return sink[immediateSinkSymbol] !== true;
|
|
114
|
+
}
|
|
94
115
|
/**
|
|
95
116
|
* Get a logger with the given category.
|
|
96
117
|
*
|
|
@@ -122,10 +143,11 @@ var LoggerImpl = class LoggerImpl {
|
|
|
122
143
|
children;
|
|
123
144
|
category;
|
|
124
145
|
sinks;
|
|
125
|
-
parentSinks = "inherit";
|
|
126
146
|
filters;
|
|
127
|
-
lowestLevel = "trace";
|
|
128
147
|
contextLocalStorage;
|
|
148
|
+
#parentSinks = "inherit";
|
|
149
|
+
#lowestLevel = "trace";
|
|
150
|
+
#sinkPlanCache = {};
|
|
129
151
|
static getLogger(category = []) {
|
|
130
152
|
let rootLogger = globalRootLoggerSymbol in globalThis ? globalThis[globalRootLoggerSymbol] ?? null : null;
|
|
131
153
|
if (rootLogger == null) {
|
|
@@ -153,6 +175,20 @@ var LoggerImpl = class LoggerImpl {
|
|
|
153
175
|
this.sinks = [];
|
|
154
176
|
this.filters = [];
|
|
155
177
|
}
|
|
178
|
+
get parentSinks() {
|
|
179
|
+
return this.#parentSinks;
|
|
180
|
+
}
|
|
181
|
+
set parentSinks(value) {
|
|
182
|
+
if (this.#parentSinks === value) return;
|
|
183
|
+
this.#parentSinks = value;
|
|
184
|
+
}
|
|
185
|
+
get lowestLevel() {
|
|
186
|
+
return this.#lowestLevel;
|
|
187
|
+
}
|
|
188
|
+
set lowestLevel(value) {
|
|
189
|
+
if (this.#lowestLevel === value) return;
|
|
190
|
+
this.#lowestLevel = value;
|
|
191
|
+
}
|
|
156
192
|
getChild(subcategory) {
|
|
157
193
|
const name = typeof subcategory === "string" ? subcategory : subcategory[0];
|
|
158
194
|
const childRef = this.children[name];
|
|
@@ -193,9 +229,72 @@ var LoggerImpl = class LoggerImpl {
|
|
|
193
229
|
return true;
|
|
194
230
|
}
|
|
195
231
|
*getSinks(level) {
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
232
|
+
const plan = this.getSinkDispatchPlan(level);
|
|
233
|
+
switch (plan.kind) {
|
|
234
|
+
case "none": return;
|
|
235
|
+
case "one":
|
|
236
|
+
yield plan.sink;
|
|
237
|
+
return;
|
|
238
|
+
case "many":
|
|
239
|
+
yield* plan.sinks;
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
getSinkDispatchPlan(level) {
|
|
244
|
+
const cached = this.#sinkPlanCache[level];
|
|
245
|
+
if (cached != null && this.isSinkDispatchPlanFresh(level, cached)) return cached;
|
|
246
|
+
const parentPlan = this.parent != null && this.parentSinks === "inherit" ? this.parent.getSinkDispatchPlan(level) : void 0;
|
|
247
|
+
const plan = this.createSinkDispatchPlan(level, parentPlan);
|
|
248
|
+
this.#sinkPlanCache[level] = plan;
|
|
249
|
+
return plan;
|
|
250
|
+
}
|
|
251
|
+
isSinkDispatchPlanFresh(level, plan) {
|
|
252
|
+
if (plan.lowestLevel !== this.lowestLevel || plan.parentSinks !== this.parentSinks || plan.localSinks.length !== this.sinks.length) return false;
|
|
253
|
+
for (let i = 0; i < plan.localSinks.length; i++) if (plan.localSinks[i] !== this.sinks[i]) return false;
|
|
254
|
+
const parentPlan = this.parent != null && this.parentSinks === "inherit" ? this.parent.getSinkDispatchPlan(level) : void 0;
|
|
255
|
+
return plan.parentPlan === parentPlan;
|
|
256
|
+
}
|
|
257
|
+
createSinkDispatchPlan(level, parentPlan) {
|
|
258
|
+
const state = {
|
|
259
|
+
localSinks: [...this.sinks],
|
|
260
|
+
parentSinks: this.parentSinks,
|
|
261
|
+
lowestLevel: this.lowestLevel,
|
|
262
|
+
parentPlan
|
|
263
|
+
};
|
|
264
|
+
if (state.lowestLevel === null) return {
|
|
265
|
+
...state,
|
|
266
|
+
kind: "none"
|
|
267
|
+
};
|
|
268
|
+
if (compareLogLevel(level, state.lowestLevel) < 0) return {
|
|
269
|
+
...state,
|
|
270
|
+
kind: "none"
|
|
271
|
+
};
|
|
272
|
+
let firstSink;
|
|
273
|
+
let sinks;
|
|
274
|
+
const appendSink = (sink) => {
|
|
275
|
+
if (sinks != null) sinks.push(sink);
|
|
276
|
+
else if (firstSink == null) firstSink = sink;
|
|
277
|
+
else sinks = [firstSink, sink];
|
|
278
|
+
};
|
|
279
|
+
if (parentPlan != null) {
|
|
280
|
+
if (parentPlan.kind === "one") firstSink = parentPlan.sink;
|
|
281
|
+
else if (parentPlan.kind === "many") sinks = [...parentPlan.sinks];
|
|
282
|
+
}
|
|
283
|
+
for (const sink of state.localSinks) appendSink(sink);
|
|
284
|
+
if (sinks != null) return {
|
|
285
|
+
...state,
|
|
286
|
+
kind: "many",
|
|
287
|
+
sinks
|
|
288
|
+
};
|
|
289
|
+
if (firstSink != null) return {
|
|
290
|
+
...state,
|
|
291
|
+
kind: "one",
|
|
292
|
+
sink: firstSink
|
|
293
|
+
};
|
|
294
|
+
return {
|
|
295
|
+
...state,
|
|
296
|
+
kind: "none"
|
|
297
|
+
};
|
|
199
298
|
}
|
|
200
299
|
isEnabledFor(level) {
|
|
201
300
|
const categoryPrefix = isMetaLoggerCategory(this.category) ? [] : getCategoryPrefix();
|
|
@@ -203,14 +302,17 @@ var LoggerImpl = class LoggerImpl {
|
|
|
203
302
|
return dispatcher.isEnabledForResolved(level);
|
|
204
303
|
}
|
|
205
304
|
isEnabledForResolved(level) {
|
|
206
|
-
|
|
207
|
-
for (const _ of this.getSinks(level)) return true;
|
|
208
|
-
return false;
|
|
305
|
+
return this.getSinkDispatchPlan(level).kind !== "none";
|
|
209
306
|
}
|
|
210
307
|
emit(record, bypassSinks) {
|
|
211
|
-
const
|
|
308
|
+
const hasCategory = "category" in record;
|
|
309
|
+
const baseCategory = hasCategory ? record.category : this.category;
|
|
212
310
|
const categoryPrefix = isMetaLoggerCategory(baseCategory) ? [] : getCategoryPrefix();
|
|
213
311
|
const fullCategory = categoryPrefix.length > 0 ? [...categoryPrefix, ...baseCategory] : baseCategory;
|
|
312
|
+
if (categoryPrefix.length < 1 && Object.prototype.hasOwnProperty.call(record, "category")) {
|
|
313
|
+
this.emitResolved(record, bypassSinks);
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
214
316
|
const descriptors = Object.getOwnPropertyDescriptors(record);
|
|
215
317
|
descriptors.category = {
|
|
216
318
|
value: fullCategory,
|
|
@@ -223,14 +325,36 @@ var LoggerImpl = class LoggerImpl {
|
|
|
223
325
|
}
|
|
224
326
|
emitResolved(record, bypassSinks) {
|
|
225
327
|
if (this.lowestLevel === null || compareLogLevel(record.level, this.lowestLevel) < 0 || !this.filter(record)) return;
|
|
226
|
-
const
|
|
227
|
-
if (
|
|
328
|
+
const plan = this.getSinkDispatchPlan(record.level);
|
|
329
|
+
if (plan.kind === "none") return;
|
|
228
330
|
let snapshot;
|
|
229
331
|
let snapshotFailed = false;
|
|
230
|
-
|
|
332
|
+
if (plan.kind === "one") {
|
|
333
|
+
const sink = plan.sink;
|
|
334
|
+
if (bypassSinks?.has(sink)) return;
|
|
335
|
+
try {
|
|
336
|
+
if (shouldSnapshotForSink(sink)) try {
|
|
337
|
+
snapshot = snapshotLogRecordProperties(record);
|
|
338
|
+
} catch {
|
|
339
|
+
snapshotFailed = true;
|
|
340
|
+
snapshot = record;
|
|
341
|
+
}
|
|
342
|
+
sink(snapshot ?? record);
|
|
343
|
+
} catch (error) {
|
|
344
|
+
const bypassSinks2 = new Set(bypassSinks);
|
|
345
|
+
bypassSinks2.add(sink);
|
|
346
|
+
metaLogger.log("fatal", "Failed to emit a log record to sink {sink}: {error}", {
|
|
347
|
+
sink,
|
|
348
|
+
error,
|
|
349
|
+
record
|
|
350
|
+
}, bypassSinks2);
|
|
351
|
+
}
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
for (const sink of plan.sinks) {
|
|
231
355
|
if (bypassSinks?.has(sink)) continue;
|
|
232
356
|
try {
|
|
233
|
-
if (snapshot == null && !snapshotFailed) try {
|
|
357
|
+
if (snapshot == null && !snapshotFailed && shouldSnapshotForSink(sink)) try {
|
|
234
358
|
snapshot = snapshotLogRecordProperties(record);
|
|
235
359
|
} catch {
|
|
236
360
|
snapshotFailed = true;
|
|
@@ -249,7 +373,20 @@ var LoggerImpl = class LoggerImpl {
|
|
|
249
373
|
}
|
|
250
374
|
}
|
|
251
375
|
log(level, rawMessage, properties, bypassSinks) {
|
|
252
|
-
const implicitContext =
|
|
376
|
+
const implicitContext = getImplicitContextIfAny();
|
|
377
|
+
if (typeof properties !== "function" && implicitContext == null && !rawMessage.includes("{") && !hasEnumerableProperties(properties)) {
|
|
378
|
+
const record$1 = {
|
|
379
|
+
category: this.category,
|
|
380
|
+
level,
|
|
381
|
+
message: [rawMessage],
|
|
382
|
+
rawMessage,
|
|
383
|
+
timestamp: Date.now(),
|
|
384
|
+
properties: {}
|
|
385
|
+
};
|
|
386
|
+
resolvedStringLogRecords.add(record$1);
|
|
387
|
+
this.emit(record$1, bypassSinks);
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
253
390
|
let cachedProps = void 0;
|
|
254
391
|
let cachedMessage = void 0;
|
|
255
392
|
const record = typeof properties === "function" ? {
|
|
@@ -263,7 +400,7 @@ var LoggerImpl = class LoggerImpl {
|
|
|
263
400
|
rawMessage,
|
|
264
401
|
get properties() {
|
|
265
402
|
if (cachedProps == null) cachedProps = resolveProperties({
|
|
266
|
-
...implicitContext,
|
|
403
|
+
...implicitContext ?? {},
|
|
267
404
|
...properties()
|
|
268
405
|
});
|
|
269
406
|
return cachedProps;
|
|
@@ -279,16 +416,17 @@ var LoggerImpl = class LoggerImpl {
|
|
|
279
416
|
rawMessage,
|
|
280
417
|
get properties() {
|
|
281
418
|
if (cachedProps == null) cachedProps = resolveProperties({
|
|
282
|
-
...implicitContext,
|
|
419
|
+
...implicitContext ?? {},
|
|
283
420
|
...properties
|
|
284
421
|
});
|
|
285
422
|
return cachedProps;
|
|
286
423
|
}
|
|
287
424
|
};
|
|
425
|
+
internalStringLogRecords.add(record);
|
|
288
426
|
this.emit(record, bypassSinks);
|
|
289
427
|
}
|
|
290
428
|
logLazily(level, callback, properties = {}) {
|
|
291
|
-
const implicitContext =
|
|
429
|
+
const implicitContext = getImplicitContextIfAny();
|
|
292
430
|
let rawMessage = void 0;
|
|
293
431
|
let msg = void 0;
|
|
294
432
|
function realizeMessage() {
|
|
@@ -312,13 +450,13 @@ var LoggerImpl = class LoggerImpl {
|
|
|
312
450
|
},
|
|
313
451
|
timestamp: Date.now(),
|
|
314
452
|
properties: {
|
|
315
|
-
...implicitContext,
|
|
453
|
+
...implicitContext ?? {},
|
|
316
454
|
...properties
|
|
317
455
|
}
|
|
318
456
|
});
|
|
319
457
|
}
|
|
320
458
|
logTemplate(level, messageTemplate, values, properties = {}) {
|
|
321
|
-
const implicitContext =
|
|
459
|
+
const implicitContext = getImplicitContextIfAny();
|
|
322
460
|
this.emit({
|
|
323
461
|
category: this.category,
|
|
324
462
|
level,
|
|
@@ -326,7 +464,7 @@ var LoggerImpl = class LoggerImpl {
|
|
|
326
464
|
rawMessage: messageTemplate,
|
|
327
465
|
timestamp: Date.now(),
|
|
328
466
|
properties: {
|
|
329
|
-
...implicitContext,
|
|
467
|
+
...implicitContext ?? {},
|
|
330
468
|
...properties
|
|
331
469
|
}
|
|
332
470
|
});
|