@logtape/logtape 2.2.0-dev.759 → 2.2.0-dev.760

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/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
- if (this.lowestLevel === null || require_level.compareLogLevel(level, this.lowestLevel) < 0) return;
197
- if (this.parent != null && this.parentSinks === "inherit") for (const sink of this.parent.getSinks(level)) yield sink;
198
- for (const sink of this.sinks) yield sink;
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
- if (this.lowestLevel === null || require_level.compareLogLevel(level, this.lowestLevel) < 0) return false;
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 baseCategory = "category" in record ? record.category : this.category;
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 sinks = [...this.getSinks(record.level)];
227
- if (sinks.length < 1) return;
328
+ const plan = this.getSinkDispatchPlan(record.level);
329
+ if (plan.kind === "none") return;
228
330
  let snapshot;
229
331
  let snapshotFailed = false;
230
- for (const sink of sinks) {
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.getImplicitContext();
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.getImplicitContext();
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.getImplicitContext();
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
  });
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.cts","names":[],"sources":["../src/logger.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"logger.d.cts","names":[],"sources":["../src/logger.ts"],"sourcesContent":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","names":[],"sources":["../src/logger.ts"],"sourcesContent":[],"mappings":"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"}
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, getImplicitContext } from "./context.js";
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
- if (this.lowestLevel === null || compareLogLevel(level, this.lowestLevel) < 0) return;
197
- if (this.parent != null && this.parentSinks === "inherit") for (const sink of this.parent.getSinks(level)) yield sink;
198
- for (const sink of this.sinks) yield sink;
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
- if (this.lowestLevel === null || compareLogLevel(level, this.lowestLevel) < 0) return false;
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 baseCategory = "category" in record ? record.category : this.category;
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 sinks = [...this.getSinks(record.level)];
227
- if (sinks.length < 1) return;
328
+ const plan = this.getSinkDispatchPlan(record.level);
329
+ if (plan.kind === "none") return;
228
330
  let snapshot;
229
331
  let snapshotFailed = false;
230
- for (const sink of sinks) {
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 = getImplicitContext();
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 = getImplicitContext();
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 = getImplicitContext();
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
  });