evlog 2.9.0 → 2.11.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/README.md +27 -1
- package/dist/{_drain-C9Nr-6Wc.mjs → _drain-YH8ERc5l.mjs} +7 -2
- package/dist/_drain-YH8ERc5l.mjs.map +1 -0
- package/dist/{_http-C2UoHWgm.mjs → _http-C_2wbJw3.mjs} +9 -20
- package/dist/_http-C_2wbJw3.mjs.map +1 -0
- package/dist/{_severity-BLiOKoxh.mjs → _severity-BZhz3f9e.mjs} +1 -1
- package/dist/{_severity-BLiOKoxh.mjs.map → _severity-BZhz3f9e.mjs.map} +1 -1
- package/dist/adapters/axiom.d.mts +1 -1
- package/dist/adapters/axiom.d.mts.map +1 -1
- package/dist/adapters/axiom.mjs +4 -4
- package/dist/adapters/axiom.mjs.map +1 -1
- package/dist/adapters/better-stack.d.mts +1 -1
- package/dist/adapters/better-stack.d.mts.map +1 -1
- package/dist/adapters/better-stack.mjs +4 -4
- package/dist/adapters/better-stack.mjs.map +1 -1
- package/dist/adapters/datadog.d.mts +86 -0
- package/dist/adapters/datadog.d.mts.map +1 -0
- package/dist/adapters/datadog.mjs +172 -0
- package/dist/adapters/datadog.mjs.map +1 -0
- package/dist/adapters/fs.d.mts +1 -1
- package/dist/adapters/fs.d.mts.map +1 -1
- package/dist/adapters/fs.mjs +1 -1
- package/dist/adapters/hyperdx.d.mts +65 -0
- package/dist/adapters/hyperdx.d.mts.map +1 -0
- package/dist/adapters/hyperdx.mjs +93 -0
- package/dist/adapters/hyperdx.mjs.map +1 -0
- package/dist/adapters/otlp.d.mts +1 -1
- package/dist/adapters/otlp.d.mts.map +1 -1
- package/dist/adapters/otlp.mjs +5 -5
- package/dist/adapters/otlp.mjs.map +1 -1
- package/dist/adapters/posthog.d.mts +1 -1
- package/dist/adapters/posthog.d.mts.map +1 -1
- package/dist/adapters/posthog.mjs +6 -6
- package/dist/adapters/posthog.mjs.map +1 -1
- package/dist/adapters/sentry.d.mts +1 -1
- package/dist/adapters/sentry.d.mts.map +1 -1
- package/dist/adapters/sentry.mjs +5 -5
- package/dist/adapters/sentry.mjs.map +1 -1
- package/dist/ai/index.d.mts +1 -1
- package/dist/browser.d.mts +3 -1
- package/dist/browser.d.mts.map +1 -1
- package/dist/browser.mjs +2 -2
- package/dist/browser.mjs.map +1 -1
- package/dist/elysia/index.d.mts +2 -2
- package/dist/elysia/index.mjs +1 -1
- package/dist/enrichers.d.mts +1 -1
- package/dist/{error-BjaGNgoo.d.mts → error-plrBYLQk.d.mts} +7 -2
- package/dist/error-plrBYLQk.d.mts.map +1 -0
- package/dist/error.d.mts +1 -1
- package/dist/error.mjs +15 -0
- package/dist/error.mjs.map +1 -1
- package/dist/{errors-BBJmxg3d.d.mts → errors-bPoj9UZk.d.mts} +2 -2
- package/dist/{errors-BBJmxg3d.d.mts.map → errors-bPoj9UZk.d.mts.map} +1 -1
- package/dist/{errors-BJRXUfMg.mjs → errors-gH4C9KSC.mjs} +1 -1
- package/dist/{errors-BJRXUfMg.mjs.map → errors-gH4C9KSC.mjs.map} +1 -1
- package/dist/express/index.d.mts +2 -2
- package/dist/express/index.mjs +2 -2
- package/dist/fastify/index.d.mts +2 -2
- package/dist/fastify/index.d.mts.map +1 -1
- package/dist/fastify/index.mjs +2 -2
- package/dist/{headers-DmzJ3sQ-.mjs → headers-BSi3UHKL.mjs} +3 -3
- package/dist/{headers-DmzJ3sQ-.mjs.map → headers-BSi3UHKL.mjs.map} +1 -1
- package/dist/hono/index.d.mts +2 -2
- package/dist/hono/index.mjs +1 -1
- package/dist/index.d.mts +5 -5
- package/dist/{logger-3ZE3g6GW.d.mts → logger-CG1eop2_.d.mts} +13 -3
- package/dist/logger-CG1eop2_.d.mts.map +1 -0
- package/dist/logger.d.mts +2 -2
- package/dist/logger.mjs +18 -2
- package/dist/logger.mjs.map +1 -1
- package/dist/{middleware-B9uwQ5B4.d.mts → middleware-DojmTj9Y.d.mts} +2 -2
- package/dist/{middleware-B9uwQ5B4.d.mts.map → middleware-DojmTj9Y.d.mts.map} +1 -1
- package/dist/nestjs/index.d.mts +2 -2
- package/dist/nestjs/index.mjs +2 -2
- package/dist/next/client.d.mts +3 -3
- package/dist/next/client.d.mts.map +1 -1
- package/dist/next/index.d.mts +4 -4
- package/dist/next/index.d.mts.map +1 -1
- package/dist/next/index.mjs +3 -2
- package/dist/next/index.mjs.map +1 -1
- package/dist/next/instrumentation.d.mts +75 -0
- package/dist/next/instrumentation.d.mts.map +1 -0
- package/dist/next/instrumentation.mjs +108 -0
- package/dist/next/instrumentation.mjs.map +1 -0
- package/dist/nitro/errorHandler.d.mts +2 -2
- package/dist/nitro/errorHandler.mjs +2 -2
- package/dist/nitro/module.d.mts +2 -2
- package/dist/nitro/plugin.d.mts +2 -2
- package/dist/nitro/plugin.mjs +4 -8
- package/dist/nitro/plugin.mjs.map +1 -1
- package/dist/nitro/v3/errorHandler.d.mts +2 -2
- package/dist/nitro/v3/errorHandler.mjs +2 -2
- package/dist/nitro/v3/index.d.mts +3 -1
- package/dist/nitro/v3/index.mjs +3 -1
- package/dist/nitro/v3/middleware.d.mts +11 -3
- package/dist/nitro/v3/middleware.d.mts.map +1 -1
- package/dist/nitro/v3/middleware.mjs +1 -21
- package/dist/nitro/v3/middleware.mjs.map +1 -1
- package/dist/nitro/v3/module.d.mts +1 -1
- package/dist/nitro/v3/plugin.d.mts +2 -2
- package/dist/nitro/v3/plugin.mjs +5 -5
- package/dist/nitro/v3/plugin.mjs.map +1 -1
- package/dist/nitro/v3/useLogger.d.mts +1 -1
- package/dist/{nitro-BbTINVdZ.d.mts → nitro-CfGx0wDJ.d.mts} +2 -3
- package/dist/nitro-CfGx0wDJ.d.mts.map +1 -0
- package/dist/{nitro-OmT_M4Pb.mjs → nitro-Dpq5ZmcM.mjs} +2 -2
- package/dist/{nitro-OmT_M4Pb.mjs.map → nitro-Dpq5ZmcM.mjs.map} +1 -1
- package/dist/nitroConfigBridge-fidbf-Y_.mjs +92 -0
- package/dist/nitroConfigBridge-fidbf-Y_.mjs.map +1 -0
- package/dist/nuxt/module.d.mts +6 -5
- package/dist/nuxt/module.d.mts.map +1 -1
- package/dist/nuxt/module.mjs +5 -3
- package/dist/nuxt/module.mjs.map +1 -1
- package/dist/{parseError-DO1qtmGL.d.mts → parseError-B_qXj8x4.d.mts} +2 -2
- package/dist/parseError-B_qXj8x4.d.mts.map +1 -0
- package/dist/react-router/index.d.mts +4 -4
- package/dist/react-router/index.d.mts.map +1 -1
- package/dist/react-router/index.mjs +2 -2
- package/dist/{routes-CGPmbzCZ.mjs → routes-CE3_c-iZ.mjs} +1 -1
- package/dist/{routes-CGPmbzCZ.mjs.map → routes-CE3_c-iZ.mjs.map} +1 -1
- package/dist/runtime/client/log.d.mts +1 -1
- package/dist/runtime/client/log.d.mts.map +1 -1
- package/dist/runtime/client/log.mjs +3 -1
- package/dist/runtime/client/log.mjs.map +1 -1
- package/dist/runtime/server/routes/_evlog/ingest.post.d.mts +2 -2
- package/dist/runtime/server/useLogger.d.mts +1 -1
- package/dist/runtime/utils/parseError.d.mts +2 -2
- package/dist/runtime/utils/parseError.mjs +1 -1
- package/dist/{source-location-DRvDDqfq.mjs → source-location-B1VVgXkh.mjs} +1 -1
- package/dist/{source-location-DRvDDqfq.mjs.map → source-location-B1VVgXkh.mjs.map} +1 -1
- package/dist/{storage-DsueXspk.mjs → storage-B6NPh8rV.mjs} +1 -1
- package/dist/{storage-DsueXspk.mjs.map → storage-B6NPh8rV.mjs.map} +1 -1
- package/dist/sveltekit/index.d.mts +2 -2
- package/dist/sveltekit/index.mjs +4 -4
- package/dist/toolkit.d.mts +3 -3
- package/dist/toolkit.mjs +4 -4
- package/dist/{types-BpsDbwHU.d.mts → types-v_JkG_D7.d.mts} +11 -1
- package/dist/types-v_JkG_D7.d.mts.map +1 -0
- package/dist/types.d.mts +1 -1
- package/dist/{useLogger-C_8vgz0g.d.mts → useLogger-TjKH37BO.d.mts} +2 -2
- package/dist/{useLogger-C_8vgz0g.d.mts.map → useLogger-TjKH37BO.d.mts.map} +1 -1
- package/dist/utils.d.mts +1 -1
- package/dist/vite/index.d.mts +1 -1
- package/dist/vite/index.mjs +1 -1
- package/dist/workers.d.mts +1 -1
- package/package.json +49 -19
- package/dist/_drain-C9Nr-6Wc.mjs.map +0 -1
- package/dist/_http-C2UoHWgm.mjs.map +0 -1
- package/dist/error-BjaGNgoo.d.mts.map +0 -1
- package/dist/logger-3ZE3g6GW.d.mts.map +0 -1
- package/dist/nitro-BbTINVdZ.d.mts.map +0 -1
- package/dist/parseError-DO1qtmGL.d.mts.map +0 -1
- package/dist/types-BpsDbwHU.d.mts.map +0 -1
package/dist/error.mjs
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { colors, isServer } from "./utils.mjs";
|
|
2
2
|
//#region src/error.ts
|
|
3
|
+
/** Non-enumerable storage so `JSON.stringify(error)` never exposes internal context */
|
|
4
|
+
const evlogErrorInternalKey = Symbol.for("evlog.error.internal");
|
|
3
5
|
/**
|
|
4
6
|
* Structured error with context for better debugging
|
|
5
7
|
*
|
|
@@ -21,6 +23,13 @@ var EvlogError = class EvlogError extends Error {
|
|
|
21
23
|
why;
|
|
22
24
|
fix;
|
|
23
25
|
link;
|
|
26
|
+
/**
|
|
27
|
+
* Backend-only context from `createError({ internal: … })`.
|
|
28
|
+
* Omitted from {@link EvlogError#toJSON} and all framework HTTP serializers.
|
|
29
|
+
*/
|
|
30
|
+
get internal() {
|
|
31
|
+
return this[evlogErrorInternalKey];
|
|
32
|
+
}
|
|
24
33
|
constructor(options) {
|
|
25
34
|
const opts = typeof options === "string" ? { message: options } : options;
|
|
26
35
|
super(opts.message, { cause: opts.cause });
|
|
@@ -29,6 +38,12 @@ var EvlogError = class EvlogError extends Error {
|
|
|
29
38
|
this.why = opts.why;
|
|
30
39
|
this.fix = opts.fix;
|
|
31
40
|
this.link = opts.link;
|
|
41
|
+
if (opts.internal !== void 0) Object.defineProperty(this, evlogErrorInternalKey, {
|
|
42
|
+
value: opts.internal,
|
|
43
|
+
enumerable: false,
|
|
44
|
+
writable: false,
|
|
45
|
+
configurable: true
|
|
46
|
+
});
|
|
32
47
|
if (Error.captureStackTrace) Error.captureStackTrace(this, EvlogError);
|
|
33
48
|
}
|
|
34
49
|
/** HTTP status text (alias for message) */
|
package/dist/error.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.mjs","names":[],"sources":["../src/error.ts"],"sourcesContent":["import type { ErrorOptions } from './types'\nimport { colors, isServer } from './utils'\n\n/**\n * Structured error with context for better debugging\n *\n * @example\n * ```ts\n * throw new EvlogError({\n * message: 'Failed to sync repository',\n * status: 503,\n * why: 'GitHub API rate limit exceeded',\n * fix: 'Wait 1 hour or use a different token',\n * link: 'https://docs.github.com/en/rest/rate-limit',\n * cause: originalError,\n * })\n * ```\n */\nexport class EvlogError extends Error {\n\n /** HTTP status code */\n readonly status: number\n readonly why?: string\n readonly fix?: string\n readonly link?: string\n\n constructor(options: ErrorOptions | string) {\n const opts = typeof options === 'string' ? { message: options } : options\n\n super(opts.message, { cause: opts.cause })\n\n this.name = 'EvlogError'\n this.status = opts.status ?? 500\n this.why = opts.why\n this.fix = opts.fix\n this.link = opts.link\n\n // Maintain proper stack trace in V8\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, EvlogError)\n }\n }\n\n /** HTTP status text (alias for message) */\n get statusText(): string {\n return this.message\n }\n\n /** HTTP status code (alias for compatibility) */\n get statusCode(): number {\n return this.status\n }\n\n /** HTTP status message (alias for compatibility) */\n get statusMessage(): string {\n return this.message\n }\n\n /** Structured data for serialization */\n get data(): { why?: string, fix?: string, link?: string } | undefined {\n if (this.why || this.fix || this.link) {\n return { why: this.why, fix: this.fix, link: this.link }\n }\n return undefined\n }\n\n override toString(): string {\n const useColors = isServer()\n\n const red = useColors ? colors.red : ''\n const yellow = useColors ? colors.yellow : ''\n const cyan = useColors ? colors.cyan : ''\n const dim = useColors ? colors.dim : ''\n const reset = useColors ? colors.reset : ''\n const bold = useColors ? colors.bold : ''\n\n const lines: string[] = []\n\n lines.push(`${red}${bold}Error:${reset} ${this.message}`)\n\n if (this.why) {\n lines.push(`${yellow}Why:${reset} ${this.why}`)\n }\n\n if (this.fix) {\n lines.push(`${cyan}Fix:${reset} ${this.fix}`)\n }\n\n if (this.link) {\n lines.push(`${dim}More info:${reset} ${this.link}`)\n }\n\n if (this.cause) {\n lines.push(`${dim}Caused by:${reset} ${(this.cause as Error).message}`)\n }\n\n return lines.join('\\n')\n }\n\n toJSON(): Record<string, unknown> {\n const { data } = this\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n ...(data && { data }),\n ...(this.cause instanceof Error && {\n cause: { name: this.cause.name, message: this.cause.message },\n }),\n }\n }\n\n}\n\n/**\n * Create a structured error with context for debugging and user-facing messages.\n *\n * @param options - Error message string or full options object\n * @returns EvlogError with HTTP metadata (`status`, `statusText`) and `data`; also includes `statusCode` and `statusMessage` for legacy compatibility\n *\n * @example\n * ```ts\n * // Simple error\n * throw createError('Something went wrong')\n *\n * // Structured error with context\n * throw createError({\n * message: 'Payment failed',\n * status: 402,\n * why: 'Card declined by issuer',\n * fix: 'Try a different payment method',\n * link: 'https://docs.example.com/payments',\n * })\n * ```\n */\nexport function createError(options: ErrorOptions | string): EvlogError {\n return new EvlogError(options)\n}\n\nexport { createError as createEvlogError }\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"error.mjs","names":[],"sources":["../src/error.ts"],"sourcesContent":["import type { ErrorOptions } from './types'\nimport { colors, isServer } from './utils'\n\n/** Non-enumerable storage so `JSON.stringify(error)` never exposes internal context */\nconst evlogErrorInternalKey = Symbol.for('evlog.error.internal')\n\n/**\n * Structured error with context for better debugging\n *\n * @example\n * ```ts\n * throw new EvlogError({\n * message: 'Failed to sync repository',\n * status: 503,\n * why: 'GitHub API rate limit exceeded',\n * fix: 'Wait 1 hour or use a different token',\n * link: 'https://docs.github.com/en/rest/rate-limit',\n * cause: originalError,\n * })\n * ```\n */\nexport class EvlogError extends Error {\n\n /** HTTP status code */\n readonly status: number\n readonly why?: string\n readonly fix?: string\n readonly link?: string\n\n /**\n * Backend-only context from `createError({ internal: … })`.\n * Omitted from {@link EvlogError#toJSON} and all framework HTTP serializers.\n */\n get internal(): Record<string, unknown> | undefined {\n return (this as EvlogError & { [evlogErrorInternalKey]?: Record<string, unknown> })[evlogErrorInternalKey]\n }\n\n constructor(options: ErrorOptions | string) {\n const opts = typeof options === 'string' ? { message: options } : options\n\n super(opts.message, { cause: opts.cause })\n\n this.name = 'EvlogError'\n this.status = opts.status ?? 500\n this.why = opts.why\n this.fix = opts.fix\n this.link = opts.link\n\n if (opts.internal !== undefined) {\n Object.defineProperty(this, evlogErrorInternalKey, {\n value: opts.internal,\n enumerable: false,\n writable: false,\n configurable: true,\n })\n }\n\n // Maintain proper stack trace in V8\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, EvlogError)\n }\n }\n\n /** HTTP status text (alias for message) */\n get statusText(): string {\n return this.message\n }\n\n /** HTTP status code (alias for compatibility) */\n get statusCode(): number {\n return this.status\n }\n\n /** HTTP status message (alias for compatibility) */\n get statusMessage(): string {\n return this.message\n }\n\n /** Structured data for serialization */\n get data(): { why?: string, fix?: string, link?: string } | undefined {\n if (this.why || this.fix || this.link) {\n return { why: this.why, fix: this.fix, link: this.link }\n }\n return undefined\n }\n\n override toString(): string {\n const useColors = isServer()\n\n const red = useColors ? colors.red : ''\n const yellow = useColors ? colors.yellow : ''\n const cyan = useColors ? colors.cyan : ''\n const dim = useColors ? colors.dim : ''\n const reset = useColors ? colors.reset : ''\n const bold = useColors ? colors.bold : ''\n\n const lines: string[] = []\n\n lines.push(`${red}${bold}Error:${reset} ${this.message}`)\n\n if (this.why) {\n lines.push(`${yellow}Why:${reset} ${this.why}`)\n }\n\n if (this.fix) {\n lines.push(`${cyan}Fix:${reset} ${this.fix}`)\n }\n\n if (this.link) {\n lines.push(`${dim}More info:${reset} ${this.link}`)\n }\n\n if (this.cause) {\n lines.push(`${dim}Caused by:${reset} ${(this.cause as Error).message}`)\n }\n\n return lines.join('\\n')\n }\n\n toJSON(): Record<string, unknown> {\n const { data } = this\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n ...(data && { data }),\n ...(this.cause instanceof Error && {\n cause: { name: this.cause.name, message: this.cause.message },\n }),\n }\n }\n\n}\n\n/**\n * Create a structured error with context for debugging and user-facing messages.\n *\n * @param options - Error message string or full options object\n * @returns EvlogError with HTTP metadata (`status`, `statusText`) and `data`; also includes `statusCode` and `statusMessage` for legacy compatibility\n *\n * @example\n * ```ts\n * // Simple error\n * throw createError('Something went wrong')\n *\n * // Structured error with context\n * throw createError({\n * message: 'Payment failed',\n * status: 402,\n * why: 'Card declined by issuer',\n * fix: 'Try a different payment method',\n * link: 'https://docs.example.com/payments',\n * })\n * ```\n */\nexport function createError(options: ErrorOptions | string): EvlogError {\n return new EvlogError(options)\n}\n\nexport { createError as createEvlogError }\n"],"mappings":";;;AAIA,MAAM,wBAAwB,OAAO,IAAI,uBAAuB;;;;;;;;;;;;;;;;AAiBhE,IAAa,aAAb,MAAa,mBAAmB,MAAM;;CAGpC;CACA;CACA;CACA;;;;;CAMA,IAAI,WAAgD;AAClD,SAAQ,KAA4E;;CAGtF,YAAY,SAAgC;EAC1C,MAAM,OAAO,OAAO,YAAY,WAAW,EAAE,SAAS,SAAS,GAAG;AAElE,QAAM,KAAK,SAAS,EAAE,OAAO,KAAK,OAAO,CAAC;AAE1C,OAAK,OAAO;AACZ,OAAK,SAAS,KAAK,UAAU;AAC7B,OAAK,MAAM,KAAK;AAChB,OAAK,MAAM,KAAK;AAChB,OAAK,OAAO,KAAK;AAEjB,MAAI,KAAK,aAAa,KAAA,EACpB,QAAO,eAAe,MAAM,uBAAuB;GACjD,OAAO,KAAK;GACZ,YAAY;GACZ,UAAU;GACV,cAAc;GACf,CAAC;AAIJ,MAAI,MAAM,kBACR,OAAM,kBAAkB,MAAM,WAAW;;;CAK7C,IAAI,aAAqB;AACvB,SAAO,KAAK;;;CAId,IAAI,aAAqB;AACvB,SAAO,KAAK;;;CAId,IAAI,gBAAwB;AAC1B,SAAO,KAAK;;;CAId,IAAI,OAAkE;AACpE,MAAI,KAAK,OAAO,KAAK,OAAO,KAAK,KAC/B,QAAO;GAAE,KAAK,KAAK;GAAK,KAAK,KAAK;GAAK,MAAM,KAAK;GAAM;;CAK5D,WAA4B;EAC1B,MAAM,YAAY,UAAU;EAE5B,MAAM,MAAM,YAAY,OAAO,MAAM;EACrC,MAAM,SAAS,YAAY,OAAO,SAAS;EAC3C,MAAM,OAAO,YAAY,OAAO,OAAO;EACvC,MAAM,MAAM,YAAY,OAAO,MAAM;EACrC,MAAM,QAAQ,YAAY,OAAO,QAAQ;EACzC,MAAM,OAAO,YAAY,OAAO,OAAO;EAEvC,MAAM,QAAkB,EAAE;AAE1B,QAAM,KAAK,GAAG,MAAM,KAAK,QAAQ,MAAM,GAAG,KAAK,UAAU;AAEzD,MAAI,KAAK,IACP,OAAM,KAAK,GAAG,OAAO,MAAM,MAAM,GAAG,KAAK,MAAM;AAGjD,MAAI,KAAK,IACP,OAAM,KAAK,GAAG,KAAK,MAAM,MAAM,GAAG,KAAK,MAAM;AAG/C,MAAI,KAAK,KACP,OAAM,KAAK,GAAG,IAAI,YAAY,MAAM,GAAG,KAAK,OAAO;AAGrD,MAAI,KAAK,MACP,OAAM,KAAK,GAAG,IAAI,YAAY,MAAM,GAAI,KAAK,MAAgB,UAAU;AAGzE,SAAO,MAAM,KAAK,KAAK;;CAGzB,SAAkC;EAChC,MAAM,EAAE,SAAS;AACjB,SAAO;GACL,MAAM,KAAK;GACX,SAAS,KAAK;GACd,QAAQ,KAAK;GACb,GAAI,QAAQ,EAAE,MAAM;GACpB,GAAI,KAAK,iBAAiB,SAAS,EACjC,OAAO;IAAE,MAAM,KAAK,MAAM;IAAM,SAAS,KAAK,MAAM;IAAS,EAC9D;GACF;;;;;;;;;;;;;;;;;;;;;;;;AA0BL,SAAgB,YAAY,SAA4C;AACtE,QAAO,IAAI,WAAW,QAAQ"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { v as RouteConfig } from "./types-
|
|
1
|
+
import { v as RouteConfig } from "./types-v_JkG_D7.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/shared/routes.d.ts
|
|
4
4
|
declare function shouldLog(path: string, include?: string[], exclude?: string[]): boolean;
|
|
@@ -36,4 +36,4 @@ declare function getServiceForPath(path: string, routes?: Record<string, RouteCo
|
|
|
36
36
|
declare function extractErrorStatus(error: unknown): number;
|
|
37
37
|
//#endregion
|
|
38
38
|
export { getServiceForPath as n, shouldLog as r, extractErrorStatus as t };
|
|
39
|
-
//# sourceMappingURL=errors-
|
|
39
|
+
//# sourceMappingURL=errors-bPoj9UZk.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors-
|
|
1
|
+
{"version":3,"file":"errors-bPoj9UZk.d.mts","names":[],"sources":["../src/shared/routes.ts","../src/shared/errors.ts"],"mappings":";;;iBAGgB,SAAA,CAAU,IAAA,UAAc,OAAA,aAAoB,OAAA;;AAA5D;;;;;;;;;AAsCA;;;;;;;;;;;iBAAgB,iBAAA,CAAkB,IAAA,UAAc,MAAA,GAAS,MAAA,SAAe,WAAA;;;;;;AAtCxE;;;;iBCIgB,kBAAA,CAAmB,KAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors-
|
|
1
|
+
{"version":3,"file":"errors-gH4C9KSC.mjs","names":[],"sources":["../src/shared/errors.ts"],"sourcesContent":["/**\n * Extract HTTP status from an error, checking both `status` and `statusCode`.\n *\n * Works with any error shape (H3, Nitro, EvlogError, plain objects).\n *\n * @beta This function is part of the evlog toolkit API for building custom framework integrations.\n */\nexport function extractErrorStatus(error: unknown): number {\n if (error === null || typeof error !== 'object') return 500\n const raw = (error as { status?: unknown }).status\n ?? (error as { statusCode?: unknown }).statusCode\n const status = Number(raw)\n return Number.isFinite(status) ? status : 500\n}\n"],"mappings":";;;;;;;;AAOA,SAAgB,mBAAmB,OAAwB;AACzD,KAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO;CACxD,MAAM,MAAO,MAA+B,UACtC,MAAmC;CACzC,MAAM,SAAS,OAAO,IAAI;AAC1B,QAAO,OAAO,SAAS,OAAO,GAAG,SAAS"}
|
package/dist/express/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { g as RequestLogger } from "../types-
|
|
2
|
-
import { t as BaseEvlogOptions } from "../middleware-
|
|
1
|
+
import { g as RequestLogger } from "../types-v_JkG_D7.mjs";
|
|
2
|
+
import { t as BaseEvlogOptions } from "../middleware-DojmTj9Y.mjs";
|
|
3
3
|
import { RequestHandler } from "express";
|
|
4
4
|
|
|
5
5
|
//#region src/express/index.d.ts
|
package/dist/express/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { n as extractSafeNodeHeaders, r as createMiddlewareLogger } from "../headers-
|
|
2
|
-
import { t as createLoggerStorage } from "../storage-
|
|
1
|
+
import { n as extractSafeNodeHeaders, r as createMiddlewareLogger } from "../headers-BSi3UHKL.mjs";
|
|
2
|
+
import { t as createLoggerStorage } from "../storage-B6NPh8rV.mjs";
|
|
3
3
|
//#region src/express/index.ts
|
|
4
4
|
const { storage, useLogger } = createLoggerStorage("middleware context. Make sure app.use(evlog()) is registered before your routes.");
|
|
5
5
|
/**
|
package/dist/fastify/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { g as RequestLogger } from "../types-
|
|
2
|
-
import { t as BaseEvlogOptions } from "../middleware-
|
|
1
|
+
import { g as RequestLogger } from "../types-v_JkG_D7.mjs";
|
|
2
|
+
import { t as BaseEvlogOptions } from "../middleware-DojmTj9Y.mjs";
|
|
3
3
|
import { FastifyPluginCallback } from "fastify";
|
|
4
4
|
|
|
5
5
|
//#region src/fastify/index.d.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/fastify/index.ts"],"mappings":";;;;;cAKiB,SAAA,sBAAS,MAAA,wBAAA,aAAA,CAAA,CAAA;AAAA,KAId,mBAAA,GAAsB,gBAAA;AAAA;EAAA,UAKtB,cAAA;IAER,GAAA;EAAA;AAAA
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/fastify/index.ts"],"mappings":";;;;;cAKiB,SAAA,sBAAS,MAAA,wBAAA,aAAA,CAAA,CAAA;AAAA,KAId,mBAAA,GAAsB,gBAAA;AAAA;EAAA,UAKtB,cAAA;IAER,GAAA;EAAA;AAAA;;;;;;;;;;;AAPJ;;;;;AAEoB;;;;;;cAyFP,KAAA,EAAK,qBAAA,CAAA,gBAAA"}
|
package/dist/fastify/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { n as extractSafeNodeHeaders, r as createMiddlewareLogger } from "../headers-
|
|
2
|
-
import { t as createLoggerStorage } from "../storage-
|
|
1
|
+
import { n as extractSafeNodeHeaders, r as createMiddlewareLogger } from "../headers-BSi3UHKL.mjs";
|
|
2
|
+
import { t as createLoggerStorage } from "../storage-B6NPh8rV.mjs";
|
|
3
3
|
//#region src/fastify/index.ts
|
|
4
4
|
const { storage, useLogger } = createLoggerStorage("plugin context. Make sure app.register(evlog) is called before your routes.");
|
|
5
5
|
const evlogPlugin = (fastify, options, done) => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { filterSafeHeaders } from "./utils.mjs";
|
|
2
2
|
import { createRequestLogger, getGlobalDrain, isEnabled, shouldKeep } from "./logger.mjs";
|
|
3
|
-
import { t as extractErrorStatus } from "./errors-
|
|
4
|
-
import { n as shouldLog, t as getServiceForPath } from "./routes-
|
|
3
|
+
import { t as extractErrorStatus } from "./errors-gH4C9KSC.mjs";
|
|
4
|
+
import { n as shouldLog, t as getServiceForPath } from "./routes-CE3_c-iZ.mjs";
|
|
5
5
|
//#region src/shared/middleware.ts
|
|
6
6
|
const noopResult = {
|
|
7
7
|
logger: {
|
|
@@ -139,4 +139,4 @@ function extractSafeNodeHeaders(headers) {
|
|
|
139
139
|
//#endregion
|
|
140
140
|
export { extractSafeNodeHeaders as n, createMiddlewareLogger as r, extractSafeHeaders as t };
|
|
141
141
|
|
|
142
|
-
//# sourceMappingURL=headers-
|
|
142
|
+
//# sourceMappingURL=headers-BSi3UHKL.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headers-
|
|
1
|
+
{"version":3,"file":"headers-BSi3UHKL.mjs","names":[],"sources":["../src/shared/middleware.ts","../src/shared/headers.ts"],"sourcesContent":["import type { DrainContext, EnrichContext, RequestLogger, RouteConfig, TailSamplingContext, WideEvent } from '../types'\nimport { createRequestLogger, getGlobalDrain, isEnabled, shouldKeep } from '../logger'\nimport { extractErrorStatus } from './errors'\nimport { shouldLog, getServiceForPath } from './routes'\n\n/**\n * Base options shared by all framework integrations.\n *\n * Every framework-specific options interface (e.g. `EvlogExpressOptions`)\n * extends this type. If a framework needs extra fields it can add them\n * on top; otherwise the base is used as-is.\n *\n * @beta Part of `evlog/toolkit` — the public API for building custom integrations.\n */\nexport interface BaseEvlogOptions {\n /** Route patterns to include in logging (glob). If not set, all routes are logged */\n include?: string[]\n /** Route patterns to exclude from logging. Exclusions take precedence over inclusions */\n exclude?: string[]\n /** Route-specific service configuration */\n routes?: Record<string, RouteConfig>\n /**\n * Drain callback called with every emitted event.\n * Use with drain adapters (Axiom, OTLP, Sentry, etc.) or custom endpoints.\n */\n drain?: (ctx: DrainContext) => void | Promise<void>\n /**\n * Enrich callback called after emit, before drain.\n * Use to add derived context (geo, deployment info, user agent, etc.).\n */\n enrich?: (ctx: EnrichContext) => void | Promise<void>\n /**\n * Custom tail sampling callback.\n * Set `ctx.shouldKeep = true` to force-keep the log regardless of head sampling.\n */\n keep?: (ctx: TailSamplingContext) => void | Promise<void>\n}\n\n/**\n * Internal options consumed by `createMiddlewareLogger`.\n * Extends `BaseEvlogOptions` with the request-specific fields\n * that framework adapters must provide.\n */\nexport interface MiddlewareLoggerOptions extends BaseEvlogOptions {\n method: string\n path: string\n requestId?: string\n /** Pre-filtered safe request headers (used for enrich/drain context) */\n headers?: Record<string, string>\n}\n\nexport interface MiddlewareLoggerResult {\n logger: RequestLogger\n finish: (opts?: { status?: number; error?: Error }) => Promise<WideEvent | null>\n skipped: boolean\n}\n\nconst noopResult: MiddlewareLoggerResult = {\n logger: {\n set() {},\n error() {},\n info() {},\n warn() {},\n emit() {\n return null \n },\n getContext() {\n return {} \n },\n },\n finish: () => Promise.resolve(null),\n skipped: true,\n}\n\nasync function runEnrichAndDrain(\n emittedEvent: WideEvent,\n options: MiddlewareLoggerOptions,\n requestInfo: { method: string; path: string; requestId?: string },\n responseStatus?: number,\n): Promise<void> {\n if (options.enrich) {\n const enrichCtx: EnrichContext = {\n event: emittedEvent,\n request: requestInfo,\n headers: options.headers,\n response: { status: responseStatus },\n }\n try {\n await options.enrich(enrichCtx)\n } catch (err) {\n console.error('[evlog] enrich failed:', err)\n }\n }\n\n const drain = options.drain ?? getGlobalDrain()\n if (drain) {\n const drainCtx: DrainContext = {\n event: emittedEvent,\n request: requestInfo,\n headers: options.headers,\n }\n try {\n await drain(drainCtx)\n } catch (err) {\n console.error('[evlog] drain failed:', err)\n }\n }\n}\n\n/**\n * Create a middleware-aware request logger with full lifecycle management.\n *\n * Handles the complete pipeline shared across all framework integrations:\n * route filtering, logger creation, service overrides, duration tracking,\n * tail sampling evaluation, event emission, enrichment, and draining.\n *\n * Framework adapters only need to:\n * 1. Extract method/path/requestId/headers from the framework request\n * 2. Call `createMiddlewareLogger()` with those + user options\n * 3. Check `skipped` — if true, skip to next middleware\n * 4. Store `logger` in framework-specific context (e.g., `c.set('log', logger)`)\n * 5. Call `finish({ status })` or `finish({ error })` at response end\n *\n * @beta Part of `evlog/toolkit` — the public API for building custom integrations.\n */\nexport function createMiddlewareLogger(options: MiddlewareLoggerOptions): MiddlewareLoggerResult {\n if (!isEnabled()) return noopResult\n\n const { method, path, requestId, include, exclude, routes, keep } = options\n\n if (!shouldLog(path, include, exclude)) {\n return noopResult\n }\n\n const resolvedRequestId = requestId || crypto.randomUUID()\n\n const logger = createRequestLogger({\n method,\n path,\n requestId: resolvedRequestId,\n }, { _deferDrain: true })\n\n const routeService = getServiceForPath(path, routes)\n if (routeService) {\n logger.set({ service: routeService })\n }\n\n const startTime = Date.now()\n const requestInfo = { method, path, requestId: resolvedRequestId }\n\n const finish = async (opts?: { status?: number; error?: Error }): Promise<WideEvent | null> => {\n const { status, error } = opts ?? {}\n\n if (error) {\n logger.error(error)\n const errorStatus = extractErrorStatus(error)\n logger.set({ status: errorStatus })\n } else if (status !== undefined) {\n logger.set({ status })\n }\n\n const durationMs = Date.now() - startTime\n\n const resolvedStatus = error\n ? extractErrorStatus(error)\n : status ?? (logger.getContext().status as number | undefined)\n\n const tailCtx: TailSamplingContext = {\n status: resolvedStatus,\n duration: durationMs,\n path,\n method,\n context: logger.getContext(),\n shouldKeep: false,\n }\n\n if (keep) {\n await keep(tailCtx)\n }\n\n const forceKeep = tailCtx.shouldKeep || shouldKeep(tailCtx)\n const emittedEvent = logger.emit({ _forceKeep: forceKeep })\n\n if (emittedEvent && (options.enrich || options.drain || getGlobalDrain())) {\n await runEnrichAndDrain(emittedEvent, options, requestInfo, resolvedStatus)\n }\n\n return emittedEvent\n }\n\n return { logger, finish, skipped: false }\n}\n","import { filterSafeHeaders } from '../utils'\n\n/**\n * Extract headers from a Web API `Headers` object and filter out sensitive ones.\n * Works with any runtime that supports the standard `Headers` API (Hono, Elysia,\n * Nitro v3, Cloudflare Workers, Bun, Deno, etc.).\n */\nexport function extractSafeHeaders(headers: Headers): Record<string, string> {\n const raw: Record<string, string> = {}\n headers.forEach((value, key) => {\n raw[key] = value\n })\n return filterSafeHeaders(raw)\n}\n\n/**\n * Extract headers from Node.js `IncomingHttpHeaders` and filter out sensitive ones.\n * Works with Express, Fastify, and any Node.js HTTP server using `req.headers`.\n */\nexport function extractSafeNodeHeaders(headers: Record<string, string | string[] | undefined>): Record<string, string> {\n const raw: Record<string, string> = {}\n for (const [key, value] of Object.entries(headers)) {\n if (value === undefined) continue\n raw[key] = Array.isArray(value) ? value.join(', ') : value\n }\n return filterSafeHeaders(raw)\n}\n"],"mappings":";;;;;AAyDA,MAAM,aAAqC;CACzC,QAAQ;EACN,MAAM;EACN,QAAQ;EACR,OAAO;EACP,OAAO;EACP,OAAO;AACL,UAAO;;EAET,aAAa;AACX,UAAO,EAAE;;EAEZ;CACD,cAAc,QAAQ,QAAQ,KAAK;CACnC,SAAS;CACV;AAED,eAAe,kBACb,cACA,SACA,aACA,gBACe;AACf,KAAI,QAAQ,QAAQ;EAClB,MAAM,YAA2B;GAC/B,OAAO;GACP,SAAS;GACT,SAAS,QAAQ;GACjB,UAAU,EAAE,QAAQ,gBAAgB;GACrC;AACD,MAAI;AACF,SAAM,QAAQ,OAAO,UAAU;WACxB,KAAK;AACZ,WAAQ,MAAM,0BAA0B,IAAI;;;CAIhD,MAAM,QAAQ,QAAQ,SAAS,gBAAgB;AAC/C,KAAI,OAAO;EACT,MAAM,WAAyB;GAC7B,OAAO;GACP,SAAS;GACT,SAAS,QAAQ;GAClB;AACD,MAAI;AACF,SAAM,MAAM,SAAS;WACd,KAAK;AACZ,WAAQ,MAAM,yBAAyB,IAAI;;;;;;;;;;;;;;;;;;;;AAqBjD,SAAgB,uBAAuB,SAA0D;AAC/F,KAAI,CAAC,WAAW,CAAE,QAAO;CAEzB,MAAM,EAAE,QAAQ,MAAM,WAAW,SAAS,SAAS,QAAQ,SAAS;AAEpE,KAAI,CAAC,UAAU,MAAM,SAAS,QAAQ,CACpC,QAAO;CAGT,MAAM,oBAAoB,aAAa,OAAO,YAAY;CAE1D,MAAM,SAAS,oBAAoB;EACjC;EACA;EACA,WAAW;EACZ,EAAE,EAAE,aAAa,MAAM,CAAC;CAEzB,MAAM,eAAe,kBAAkB,MAAM,OAAO;AACpD,KAAI,aACF,QAAO,IAAI,EAAE,SAAS,cAAc,CAAC;CAGvC,MAAM,YAAY,KAAK,KAAK;CAC5B,MAAM,cAAc;EAAE;EAAQ;EAAM,WAAW;EAAmB;CAElE,MAAM,SAAS,OAAO,SAAyE;EAC7F,MAAM,EAAE,QAAQ,UAAU,QAAQ,EAAE;AAEpC,MAAI,OAAO;AACT,UAAO,MAAM,MAAM;GACnB,MAAM,cAAc,mBAAmB,MAAM;AAC7C,UAAO,IAAI,EAAE,QAAQ,aAAa,CAAC;aAC1B,WAAW,KAAA,EACpB,QAAO,IAAI,EAAE,QAAQ,CAAC;EAGxB,MAAM,aAAa,KAAK,KAAK,GAAG;EAEhC,MAAM,iBAAiB,QACnB,mBAAmB,MAAM,GACzB,UAAW,OAAO,YAAY,CAAC;EAEnC,MAAM,UAA+B;GACnC,QAAQ;GACR,UAAU;GACV;GACA;GACA,SAAS,OAAO,YAAY;GAC5B,YAAY;GACb;AAED,MAAI,KACF,OAAM,KAAK,QAAQ;EAGrB,MAAM,YAAY,QAAQ,cAAc,WAAW,QAAQ;EAC3D,MAAM,eAAe,OAAO,KAAK,EAAE,YAAY,WAAW,CAAC;AAE3D,MAAI,iBAAiB,QAAQ,UAAU,QAAQ,SAAS,gBAAgB,EACtE,OAAM,kBAAkB,cAAc,SAAS,aAAa,eAAe;AAG7E,SAAO;;AAGT,QAAO;EAAE;EAAQ;EAAQ,SAAS;EAAO;;;;;;;;;ACvL3C,SAAgB,mBAAmB,SAA0C;CAC3E,MAAM,MAA8B,EAAE;AACtC,SAAQ,SAAS,OAAO,QAAQ;AAC9B,MAAI,OAAO;GACX;AACF,QAAO,kBAAkB,IAAI;;;;;;AAO/B,SAAgB,uBAAuB,SAAgF;CACrH,MAAM,MAA8B,EAAE;AACtC,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,EAAE;AAClD,MAAI,UAAU,KAAA,EAAW;AACzB,MAAI,OAAO,MAAM,QAAQ,MAAM,GAAG,MAAM,KAAK,KAAK,GAAG;;AAEvD,QAAO,kBAAkB,IAAI"}
|
package/dist/hono/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { g as RequestLogger } from "../types-
|
|
2
|
-
import { t as BaseEvlogOptions } from "../middleware-
|
|
1
|
+
import { g as RequestLogger } from "../types-v_JkG_D7.mjs";
|
|
2
|
+
import { t as BaseEvlogOptions } from "../middleware-DojmTj9Y.mjs";
|
|
3
3
|
import { MiddlewareHandler } from "hono";
|
|
4
4
|
|
|
5
5
|
//#region src/hono/index.d.ts
|
package/dist/hono/index.mjs
CHANGED
package/dist/index.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { C as TailSamplingContext, S as TailSamplingCondition, T as WideEvent, _ as RequestLoggerOptions, a as EnvironmentContext, b as SamplingRates, c as H3EventContext, d as Log, f as LogLevel, g as RequestLogger, i as EnrichContext, l as IngestPayload, m as ParsedError, n as DeepPartial, o as ErrorOptions, p as LoggerConfig, r as DrainContext, s as FieldContext, t as BaseWideEvent, u as InternalFields, w as TransportConfig, x as ServerEvent, y as SamplingConfig } from "./types-
|
|
2
|
-
import { n as createError, t as EvlogError } from "./error-
|
|
3
|
-
import {
|
|
4
|
-
import { t as useLogger } from "./useLogger-
|
|
5
|
-
import { t as parseError } from "./parseError-
|
|
1
|
+
import { C as TailSamplingContext, S as TailSamplingCondition, T as WideEvent, _ as RequestLoggerOptions, a as EnvironmentContext, b as SamplingRates, c as H3EventContext, d as Log, f as LogLevel, g as RequestLogger, i as EnrichContext, l as IngestPayload, m as ParsedError, n as DeepPartial, o as ErrorOptions, p as LoggerConfig, r as DrainContext, s as FieldContext, t as BaseWideEvent, u as InternalFields, w as TransportConfig, x as ServerEvent, y as SamplingConfig } from "./types-v_JkG_D7.mjs";
|
|
2
|
+
import { n as createError, t as EvlogError } from "./error-plrBYLQk.mjs";
|
|
3
|
+
import { i as getEnvironment, n as createLogger, o as initLogger, r as createRequestLogger, s as isEnabled, t as _log, u as shouldKeep } from "./logger-CG1eop2_.mjs";
|
|
4
|
+
import { t as useLogger } from "./useLogger-TjKH37BO.mjs";
|
|
5
|
+
import { t as parseError } from "./parseError-B_qXj8x4.mjs";
|
|
6
6
|
export { type BaseWideEvent, type DeepPartial, type DrainContext, type EnrichContext, type EnvironmentContext, type ErrorOptions, EvlogError, type FieldContext, type H3EventContext, type IngestPayload, type InternalFields, type Log, type LogLevel, type LoggerConfig, type ParsedError, type RequestLogger, type RequestLoggerOptions, type SamplingConfig, type SamplingRates, type ServerEvent, type TailSamplingCondition, type TailSamplingContext, type TransportConfig, type WideEvent, createError, createError as createEvlogError, createLogger, createRequestLogger, getEnvironment, initLogger, isEnabled, _log as log, parseError, shouldKeep, useLogger };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { C as TailSamplingContext, _ as RequestLoggerOptions, a as EnvironmentContext, d as Log, g as RequestLogger, p as LoggerConfig, r as DrainContext } from "./types-
|
|
1
|
+
import { C as TailSamplingContext, _ as RequestLoggerOptions, a as EnvironmentContext, d as Log, g as RequestLogger, p as LoggerConfig, r as DrainContext } from "./types-v_JkG_D7.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/logger.d.ts
|
|
4
4
|
/**
|
|
@@ -10,6 +10,16 @@ declare function initLogger(config?: LoggerConfig): void;
|
|
|
10
10
|
* Check if logging is globally enabled.
|
|
11
11
|
*/
|
|
12
12
|
declare function isEnabled(): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* @internal Lock the logger to prevent re-initialization.
|
|
15
|
+
* Called by instrumentation register() after setting up the logger with drain.
|
|
16
|
+
* Prevents configureHandler() from overwriting the drain config.
|
|
17
|
+
*/
|
|
18
|
+
declare function lockLogger(): void;
|
|
19
|
+
/**
|
|
20
|
+
* @internal Check if the logger has been locked by instrumentation.
|
|
21
|
+
*/
|
|
22
|
+
declare function isLoggerLocked(): boolean;
|
|
13
23
|
/**
|
|
14
24
|
* @internal Get the globally configured drain callback.
|
|
15
25
|
* Used by framework middleware to fall back to the global drain
|
|
@@ -71,5 +81,5 @@ declare function createRequestLogger<T extends object = Record<string, unknown>>
|
|
|
71
81
|
*/
|
|
72
82
|
declare function getEnvironment(): EnvironmentContext;
|
|
73
83
|
//#endregion
|
|
74
|
-
export { getGlobalDrain as a,
|
|
75
|
-
//# sourceMappingURL=logger-
|
|
84
|
+
export { getGlobalDrain as a, isLoggerLocked as c, getEnvironment as i, lockLogger as l, createLogger as n, initLogger as o, createRequestLogger as r, isEnabled as s, _log as t, shouldKeep as u };
|
|
85
|
+
//# sourceMappingURL=logger-CG1eop2_.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger-CG1eop2_.d.mts","names":[],"sources":["../src/logger.ts"],"mappings":";;;;;AA2CA;;iBAAgB,UAAA,CAAW,MAAA,GAAQ,YAAA;;;AA0BnC;iBAAgB,SAAA,CAAA;;;;AAShB;;iBAAgB,UAAA,CAAA;;;AAOhB;iBAAgB,cAAA,CAAA;;;;AAShB;;iBAAgB,cAAA,CAAA,KAAoB,GAAA,EAAK,YAAA,YAAwB,OAAA;;;;;iBA8BjD,UAAA,CAAW,GAAA,EAAK,mBAAA;;AAAhC;;;;;AAgBC;;;cAqLK,IAAA,EAAM,GAAA;AAOU;;;AAAA,UAkBZ,2BAAA;EAKG;AAcb;;;EAdE,WAAA;AAAA;;;;;;;;;;;;iBAcc,YAAA,oBAAgC,MAAA,kBAAA,CAAyB,cAAA,GAAgB,MAAA,mBAA8B,eAAA,GAAkB,2BAAA,GAA8B,aAAA,CAAc,CAAA;;;;AAsHrL;;;;;;;;;iBAAgB,mBAAA,oBAAuC,MAAA,kBAAA,CAAyB,OAAA,GAAS,oBAAA,EAA2B,eAAA,GAAkB,2BAAA,GAA8B,aAAA,CAAc,CAAA;;;;iBAWlK,cAAA,CAAA,GAAkB,kBAAA"}
|
package/dist/logger.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as getGlobalDrain, c as
|
|
2
|
-
export { createLogger, createRequestLogger, getEnvironment, getGlobalDrain, initLogger, isEnabled, _log as log, shouldKeep };
|
|
1
|
+
import { a as getGlobalDrain, c as isLoggerLocked, i as getEnvironment, l as lockLogger, n as createLogger, o as initLogger, r as createRequestLogger, s as isEnabled, t as _log, u as shouldKeep } from "./logger-CG1eop2_.mjs";
|
|
2
|
+
export { createLogger, createRequestLogger, getEnvironment, getGlobalDrain, initLogger, isEnabled, isLoggerLocked, lockLogger, _log as log, shouldKeep };
|
package/dist/logger.mjs
CHANGED
|
@@ -27,6 +27,7 @@ let globalStringify = true;
|
|
|
27
27
|
let globalDrain;
|
|
28
28
|
let globalEnabled = true;
|
|
29
29
|
let globalSilent = false;
|
|
30
|
+
let _locked = false;
|
|
30
31
|
/**
|
|
31
32
|
* Initialize the logger with configuration.
|
|
32
33
|
* Call this once at application startup.
|
|
@@ -55,6 +56,20 @@ function isEnabled() {
|
|
|
55
56
|
return globalEnabled;
|
|
56
57
|
}
|
|
57
58
|
/**
|
|
59
|
+
* @internal Lock the logger to prevent re-initialization.
|
|
60
|
+
* Called by instrumentation register() after setting up the logger with drain.
|
|
61
|
+
* Prevents configureHandler() from overwriting the drain config.
|
|
62
|
+
*/
|
|
63
|
+
function lockLogger() {
|
|
64
|
+
_locked = true;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* @internal Check if the logger has been locked by instrumentation.
|
|
68
|
+
*/
|
|
69
|
+
function isLoggerLocked() {
|
|
70
|
+
return _locked;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
58
73
|
* @internal Get the globally configured drain callback.
|
|
59
74
|
* Used by framework middleware to fall back to the global drain
|
|
60
75
|
* when no middleware-level drain is provided.
|
|
@@ -269,7 +284,8 @@ function createLogger(initialContext = {}, internalOptions) {
|
|
|
269
284
|
"statusCode",
|
|
270
285
|
"statusMessage",
|
|
271
286
|
"data",
|
|
272
|
-
"cause"
|
|
287
|
+
"cause",
|
|
288
|
+
"internal"
|
|
273
289
|
]) if (k in err) errorObj[k] = errRecord[k];
|
|
274
290
|
if (isPlainObject(context.error)) mergeInto(context.error, errorObj);
|
|
275
291
|
else context.error = errorObj;
|
|
@@ -341,6 +357,6 @@ function getEnvironment() {
|
|
|
341
357
|
}
|
|
342
358
|
if (typeof __EVLOG_CONFIG__ !== "undefined") initLogger(__EVLOG_CONFIG__);
|
|
343
359
|
//#endregion
|
|
344
|
-
export { createLogger, createRequestLogger, getEnvironment, getGlobalDrain, initLogger, isEnabled, _log as log, shouldKeep };
|
|
360
|
+
export { createLogger, createRequestLogger, getEnvironment, getGlobalDrain, initLogger, isEnabled, isLoggerLocked, lockLogger, _log as log, shouldKeep };
|
|
345
361
|
|
|
346
362
|
//# sourceMappingURL=logger.mjs.map
|
package/dist/logger.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.mjs","names":[],"sources":["../src/logger.ts"],"sourcesContent":["import type { DrainContext, EnvironmentContext, FieldContext, Log, LogLevel, LoggerConfig, RequestLogger, RequestLoggerOptions, SamplingConfig, TailSamplingContext, WideEvent } from './types'\nimport { colors, cssColors, detectEnvironment, escapeFormatString, formatDuration, getConsoleMethod, getCssLevelColor, getLevelColor, isClient, isDev, matchesPattern } from './utils'\n\nfunction isPlainObject(val: unknown): val is Record<string, unknown> {\n return val !== null && typeof val === 'object' && !Array.isArray(val)\n}\n\nconst _tsDate = new Date()\nfunction isoNow(): string {\n _tsDate.setTime(Date.now())\n return _tsDate.toISOString()\n}\n\nfunction mergeInto(target: Record<string, unknown>, source: Record<string, unknown>): void {\n for (const key in source) {\n const sourceVal = source[key]\n if (sourceVal === undefined || sourceVal === null) continue\n const targetVal = target[key]\n if (isPlainObject(sourceVal) && isPlainObject(targetVal)) {\n mergeInto(targetVal, sourceVal)\n } else {\n target[key] = sourceVal\n }\n }\n}\n\nlet globalEnv: EnvironmentContext = {\n service: 'app',\n environment: 'development',\n}\n\nlet globalPretty = isDev()\nlet globalSampling: SamplingConfig = {}\nlet globalStringify = true\nlet globalDrain: ((ctx: DrainContext) => void | Promise<void>) | undefined\nlet globalEnabled = true\nlet globalSilent = false\n\n/**\n * Initialize the logger with configuration.\n * Call this once at application startup.\n */\nexport function initLogger(config: LoggerConfig = {}): void {\n globalEnabled = config.enabled ?? true\n const detected = detectEnvironment()\n\n globalEnv = {\n service: config.env?.service ?? detected.service ?? 'app',\n environment: config.env?.environment ?? detected.environment ?? 'development',\n version: config.env?.version ?? detected.version,\n commitHash: config.env?.commitHash ?? detected.commitHash,\n region: config.env?.region ?? detected.region,\n }\n\n globalPretty = config.pretty ?? isDev()\n globalSampling = config.sampling ?? {}\n globalStringify = config.stringify ?? true\n globalDrain = config.drain\n globalSilent = config.silent ?? false\n\n if (globalSilent && !globalDrain && !config._suppressDrainWarning) {\n console.warn('[evlog] silent mode is enabled but no drain is configured. Events will be built and sampled but not output anywhere. Set a drain via initLogger({ drain }) or a framework hook (evlog:drain).')\n }\n}\n\n/**\n * Check if logging is globally enabled.\n */\nexport function isEnabled(): boolean {\n return globalEnabled\n}\n\n/**\n * @internal Get the globally configured drain callback.\n * Used by framework middleware to fall back to the global drain\n * when no middleware-level drain is provided.\n */\nexport function getGlobalDrain(): ((ctx: DrainContext) => void | Promise<void>) | undefined {\n return globalDrain\n}\n\n/**\n * Determine if a log at the given level should be emitted based on sampling config.\n * Error level defaults to 100% (always logged) unless explicitly configured otherwise.\n */\nfunction shouldSample(level: LogLevel): boolean {\n const { rates } = globalSampling\n if (!rates) {\n return true // No sampling configured, log everything\n }\n\n // Error defaults to 100% unless explicitly set\n const percentage = level === 'error' && rates.error === undefined\n ? 100\n : rates[level] ?? 100\n\n // 0% = never log, 100% = always log\n if (percentage <= 0) return false\n if (percentage >= 100) return true\n\n return Math.random() * 100 < percentage\n}\n\n/**\n * Evaluate tail sampling conditions to determine if a log should be force-kept.\n * Returns true if ANY condition matches (OR logic).\n */\nexport function shouldKeep(ctx: TailSamplingContext): boolean {\n const { keep } = globalSampling\n if (!keep?.length) return false\n\n return keep.some((condition) => {\n if (condition.status !== undefined && ctx.status !== undefined && ctx.status >= condition.status) {\n return true\n }\n if (condition.duration !== undefined && ctx.duration !== undefined && ctx.duration >= condition.duration) {\n return true\n }\n if (condition.path && ctx.path && matchesPattern(ctx.path, condition.path)) {\n return true\n }\n return false\n })\n}\n\nfunction emitWideEvent(level: LogLevel, event: Record<string, unknown>, deferDrain = false, ownsEvent = false): WideEvent | null {\n if (!globalEnabled) return null\n\n if (!ownsEvent && !shouldSample(level)) {\n return null\n }\n\n let formatted: WideEvent\n if (ownsEvent) {\n event.timestamp = isoNow()\n event.level = level\n if (event.service === undefined) event.service = globalEnv.service\n if (event.environment === undefined) event.environment = globalEnv.environment\n if (globalEnv.version !== undefined && event.version === undefined) event.version = globalEnv.version\n if (globalEnv.commitHash !== undefined && event.commitHash === undefined) event.commitHash = globalEnv.commitHash\n if (globalEnv.region !== undefined && event.region === undefined) event.region = globalEnv.region\n formatted = event as WideEvent\n } else {\n formatted = {\n timestamp: isoNow(),\n level,\n ...globalEnv,\n ...event,\n }\n }\n\n if (!globalSilent) {\n if (globalPretty) {\n prettyPrintWideEvent(formatted)\n } else if (globalStringify) {\n console[getConsoleMethod(level)](JSON.stringify(formatted))\n } else {\n console[getConsoleMethod(level)](formatted)\n }\n }\n\n if (globalDrain && !deferDrain) {\n Promise.resolve(globalDrain({ event: formatted })).catch((err) => {\n console.error('[evlog] drain failed:', err)\n })\n }\n\n return formatted\n}\n\nfunction emitTaggedLog(level: LogLevel, tag: string, message: string): void {\n if (!globalEnabled) return\n\n if (globalPretty && !globalSilent) {\n if (!shouldSample(level)) {\n return\n }\n\n if (isClient()) {\n const levelColor = getCssLevelColor(level)\n const timestamp = isoNow().slice(11, 23)\n console.log(\n `%c${timestamp}%c %c[${escapeFormatString(tag)}]%c ${escapeFormatString(message)}`,\n cssColors.dim,\n cssColors.reset,\n levelColor,\n cssColors.reset,\n )\n } else {\n const color = getLevelColor(level)\n const timestamp = isoNow().slice(11, 23)\n console.log(`${colors.dim}${timestamp}${colors.reset} ${color}[${tag}]${colors.reset} ${message}`)\n }\n\n return\n }\n emitWideEvent(level, { tag, message })\n}\n\nfunction formatValue(value: unknown): string {\n if (value === null || value === undefined) {\n return String(value)\n }\n if (typeof value === 'object') {\n // Flatten object to key=value pairs\n const pairs: string[] = []\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (v !== undefined && v !== null) {\n if (typeof v === 'object') {\n // For nested objects, show as JSON\n pairs.push(`${k}=${JSON.stringify(v)}`)\n } else {\n pairs.push(`${k}=${v}`)\n }\n }\n }\n return pairs.join(' ')\n }\n return String(value)\n}\n\nfunction prettyPrintWideEvent(event: Record<string, unknown>): void {\n const { timestamp, level, service, environment, version, ...rest } = event\n const ts = (timestamp as string).slice(11, 23)\n const browser = isClient()\n\n const parts: string[] = []\n const styles: string[] = []\n\n if (browser) {\n const lc = getCssLevelColor(level as string)\n parts.push(`%c${ts}%c %c${(level as string).toUpperCase()}%c %c[${escapeFormatString(String(service))}]%c`)\n styles.push(cssColors.dim, cssColors.reset, lc, cssColors.reset, cssColors.cyan, cssColors.reset)\n } else {\n const lc = getLevelColor(level as string)\n parts.push(`${colors.dim}${ts}${colors.reset} ${lc}${(level as string).toUpperCase()}${colors.reset} ${colors.cyan}[${service}]${colors.reset}`)\n }\n\n if (rest.method && rest.path) {\n parts.push(browser ? ` ${escapeFormatString(String(rest.method))} ${escapeFormatString(String(rest.path))}` : ` ${rest.method} ${rest.path}`)\n delete rest.method\n delete rest.path\n }\n\n if (rest.status) {\n const sc = browser\n ? ((rest.status as number) >= 400 ? cssColors.red : cssColors.green)\n : ((rest.status as number) >= 400 ? colors.red : colors.green)\n if (browser) {\n parts.push(` %c${rest.status}%c`)\n styles.push(sc, cssColors.reset)\n } else {\n parts.push(` ${sc}${rest.status}${colors.reset}`)\n }\n delete rest.status\n }\n\n if (rest.duration) {\n if (browser) {\n parts.push(` %c${escapeFormatString(`in ${rest.duration}`)}%c`)\n styles.push(cssColors.dim, cssColors.reset)\n } else {\n parts.push(` ${colors.dim}in ${rest.duration}${colors.reset}`)\n }\n delete rest.duration\n }\n\n console.log(parts.join(''), ...styles)\n\n const entries = Object.entries(rest).filter(([_, v]) => v !== undefined)\n const lastIndex = entries.length - 1\n\n entries.forEach(([key, value], index) => {\n const prefix = index === lastIndex ? '└─' : '├─'\n const val = formatValue(value)\n if (browser) {\n console.log(` %c${prefix}%c %c${escapeFormatString(key)}:%c ${escapeFormatString(val)}`, cssColors.dim, cssColors.reset, cssColors.cyan, cssColors.reset)\n } else {\n console.log(` ${colors.dim}${prefix}${colors.reset} ${colors.cyan}${key}:${colors.reset} ${val}`)\n }\n })\n}\n\nfunction createLogMethod(level: LogLevel) {\n return function logMethod(tagOrEvent: string | Record<string, unknown>, message?: string): void {\n if (typeof tagOrEvent === 'string' && message !== undefined) {\n emitTaggedLog(level, tagOrEvent, message)\n } else if (typeof tagOrEvent === 'object') {\n emitWideEvent(level, tagOrEvent)\n } else {\n emitTaggedLog(level, 'log', String(tagOrEvent))\n }\n }\n}\n\n/**\n * Simple logging API - as easy as console.log\n *\n * @example\n * ```ts\n * log.info('auth', 'User logged in')\n * log.error({ action: 'payment', error: 'failed' })\n * ```\n */\nconst _log: Log = {\n info: createLogMethod('info'),\n error: createLogMethod('error'),\n warn: createLogMethod('warn'),\n debug: createLogMethod('debug'),\n}\n\nexport { _log as log }\n\nconst noopLogger: RequestLogger = {\n set() {},\n error() {},\n info() {},\n warn() {},\n emit() {\n return null\n },\n getContext() {\n return {}\n },\n}\n\n/**\n * @internal Options for createLogger that are not part of the public API.\n */\ninterface CreateLoggerInternalOptions {\n /**\n * When true, the global drain is skipped on emit.\n * Used by framework middleware that runs its own enrich+drain pipeline.\n */\n _deferDrain?: boolean\n}\n\n/**\n * Create a scoped logger for building wide events.\n * Use this for any context: workflows, jobs, scripts, queues, etc.\n *\n * @example\n * ```ts\n * const log = createLogger({ jobId: job.id, queue: 'emails' })\n * log.set({ batch: { size: 50, processed: 12 } })\n * log.emit()\n * ```\n */\nexport function createLogger<T extends object = Record<string, unknown>>(initialContext: Record<string, unknown> = {}, internalOptions?: CreateLoggerInternalOptions): RequestLogger<T> {\n if (!globalEnabled) return noopLogger as RequestLogger<T>\n\n const deferDrain = internalOptions?._deferDrain ?? false\n const startTime = Date.now()\n const context: Record<string, unknown> = { ...initialContext }\n let hasError = false\n let hasWarn = false\n\n function addLog(level: 'info' | 'warn', message: string): void {\n if (!Array.isArray(context.requestLogs)) {\n context.requestLogs = []\n }\n (context.requestLogs as unknown[]).push({\n level,\n message,\n timestamp: isoNow(),\n })\n }\n\n return {\n set(data: FieldContext<T>): void {\n mergeInto(context, data as Record<string, unknown>)\n },\n\n error(error: Error | string, errorContext?: FieldContext<T>): void {\n hasError = true\n const err = typeof error === 'string' ? new Error(error) : error\n\n if (errorContext) {\n mergeInto(context, errorContext as Record<string, unknown>)\n }\n\n const errorObj: Record<string, unknown> = {\n name: err.name,\n message: err.message,\n stack: err.stack,\n }\n const errRecord = err as unknown as Record<string, unknown>\n for (const k of ['status', 'statusText', 'statusCode', 'statusMessage', 'data', 'cause'] as const) {\n if (k in err) errorObj[k] = errRecord[k]\n }\n\n if (isPlainObject(context.error)) {\n mergeInto(context.error as Record<string, unknown>, errorObj)\n } else {\n context.error = errorObj\n }\n },\n\n info(message: string, infoContext?: FieldContext<T>): void {\n addLog('info', message)\n if (infoContext) {\n const { requestLogs: _, ...rest } = infoContext as Record<string, unknown>\n mergeInto(context, rest)\n }\n },\n\n warn(message: string, warnContext?: FieldContext<T>): void {\n hasWarn = true\n addLog('warn', message)\n if (warnContext) {\n const { requestLogs: _, ...rest } = warnContext as Record<string, unknown>\n mergeInto(context, rest)\n }\n },\n\n emit(overrides?: FieldContext<T> & { _forceKeep?: boolean }): WideEvent | null {\n const durationMs = Date.now() - startTime\n const level: LogLevel = hasError ? 'error' : hasWarn ? 'warn' : 'info'\n\n let forceKeep = false\n if (overrides?._forceKeep) {\n forceKeep = true\n } else if (globalSampling.keep?.length) {\n const status = (overrides as Record<string, unknown> | undefined)?.status ?? context.status\n forceKeep = shouldKeep({\n status: status as number | undefined,\n duration: durationMs,\n path: context.path as string | undefined,\n method: context.method as string | undefined,\n context,\n })\n }\n\n if (!forceKeep && !shouldSample(level)) {\n return null\n }\n\n if (overrides) {\n const obj = overrides as Record<string, unknown>\n for (const key in obj) {\n if (key !== '_forceKeep') context[key] = obj[key]\n }\n }\n context.duration = formatDuration(durationMs)\n\n return emitWideEvent(level, context, deferDrain, true)\n },\n\n getContext(): FieldContext<T> & Record<string, unknown> {\n return { ...context }\n },\n }\n}\n\n/**\n * Create a request-scoped logger for building wide events.\n * Convenience wrapper around `createLogger` that pre-populates HTTP request fields.\n *\n * @example\n * ```ts\n * const log = createRequestLogger({ method: 'POST', path: '/checkout' })\n * log.set({ user: { id: '123' } })\n * log.set({ cart: { items: 3 } })\n * log.emit()\n * ```\n */\nexport function createRequestLogger<T extends object = Record<string, unknown>>(options: RequestLoggerOptions = {}, internalOptions?: CreateLoggerInternalOptions): RequestLogger<T> {\n const initial: Record<string, unknown> = {}\n if (options.method !== undefined) initial.method = options.method\n if (options.path !== undefined) initial.path = options.path\n if (options.requestId !== undefined) initial.requestId = options.requestId\n return createLogger<T>(initial, internalOptions)\n}\n\n/**\n * Get the current environment context.\n */\nexport function getEnvironment(): EnvironmentContext {\n return { ...globalEnv }\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\ndeclare const __EVLOG_CONFIG__: import('./types').LoggerConfig | undefined\n\nif (typeof __EVLOG_CONFIG__ !== 'undefined') initLogger(__EVLOG_CONFIG__)\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"logger.mjs","names":[],"sources":["../src/logger.ts"],"sourcesContent":["import type { DrainContext, EnvironmentContext, FieldContext, Log, LogLevel, LoggerConfig, RequestLogger, RequestLoggerOptions, SamplingConfig, TailSamplingContext, WideEvent } from './types'\nimport { colors, cssColors, detectEnvironment, escapeFormatString, formatDuration, getConsoleMethod, getCssLevelColor, getLevelColor, isClient, isDev, matchesPattern } from './utils'\n\nfunction isPlainObject(val: unknown): val is Record<string, unknown> {\n return val !== null && typeof val === 'object' && !Array.isArray(val)\n}\n\nconst _tsDate = new Date()\nfunction isoNow(): string {\n _tsDate.setTime(Date.now())\n return _tsDate.toISOString()\n}\n\nfunction mergeInto(target: Record<string, unknown>, source: Record<string, unknown>): void {\n for (const key in source) {\n const sourceVal = source[key]\n if (sourceVal === undefined || sourceVal === null) continue\n const targetVal = target[key]\n if (isPlainObject(sourceVal) && isPlainObject(targetVal)) {\n mergeInto(targetVal, sourceVal)\n } else {\n target[key] = sourceVal\n }\n }\n}\n\nlet globalEnv: EnvironmentContext = {\n service: 'app',\n environment: 'development',\n}\n\nlet globalPretty = isDev()\nlet globalSampling: SamplingConfig = {}\nlet globalStringify = true\nlet globalDrain: ((ctx: DrainContext) => void | Promise<void>) | undefined\nlet globalEnabled = true\nlet globalSilent = false\nlet _locked = false\n\n/**\n * Initialize the logger with configuration.\n * Call this once at application startup.\n */\nexport function initLogger(config: LoggerConfig = {}): void {\n globalEnabled = config.enabled ?? true\n const detected = detectEnvironment()\n\n globalEnv = {\n service: config.env?.service ?? detected.service ?? 'app',\n environment: config.env?.environment ?? detected.environment ?? 'development',\n version: config.env?.version ?? detected.version,\n commitHash: config.env?.commitHash ?? detected.commitHash,\n region: config.env?.region ?? detected.region,\n }\n\n globalPretty = config.pretty ?? isDev()\n globalSampling = config.sampling ?? {}\n globalStringify = config.stringify ?? true\n globalDrain = config.drain\n globalSilent = config.silent ?? false\n\n if (globalSilent && !globalDrain && !config._suppressDrainWarning) {\n console.warn('[evlog] silent mode is enabled but no drain is configured. Events will be built and sampled but not output anywhere. Set a drain via initLogger({ drain }) or a framework hook (evlog:drain).')\n }\n}\n\n/**\n * Check if logging is globally enabled.\n */\nexport function isEnabled(): boolean {\n return globalEnabled\n}\n\n/**\n * @internal Lock the logger to prevent re-initialization.\n * Called by instrumentation register() after setting up the logger with drain.\n * Prevents configureHandler() from overwriting the drain config.\n */\nexport function lockLogger(): void {\n _locked = true\n}\n\n/**\n * @internal Check if the logger has been locked by instrumentation.\n */\nexport function isLoggerLocked(): boolean {\n return _locked\n}\n\n/**\n * @internal Get the globally configured drain callback.\n * Used by framework middleware to fall back to the global drain\n * when no middleware-level drain is provided.\n */\nexport function getGlobalDrain(): ((ctx: DrainContext) => void | Promise<void>) | undefined {\n return globalDrain\n}\n\n/**\n * Determine if a log at the given level should be emitted based on sampling config.\n * Error level defaults to 100% (always logged) unless explicitly configured otherwise.\n */\nfunction shouldSample(level: LogLevel): boolean {\n const { rates } = globalSampling\n if (!rates) {\n return true // No sampling configured, log everything\n }\n\n // Error defaults to 100% unless explicitly set\n const percentage = level === 'error' && rates.error === undefined\n ? 100\n : rates[level] ?? 100\n\n // 0% = never log, 100% = always log\n if (percentage <= 0) return false\n if (percentage >= 100) return true\n\n return Math.random() * 100 < percentage\n}\n\n/**\n * Evaluate tail sampling conditions to determine if a log should be force-kept.\n * Returns true if ANY condition matches (OR logic).\n */\nexport function shouldKeep(ctx: TailSamplingContext): boolean {\n const { keep } = globalSampling\n if (!keep?.length) return false\n\n return keep.some((condition) => {\n if (condition.status !== undefined && ctx.status !== undefined && ctx.status >= condition.status) {\n return true\n }\n if (condition.duration !== undefined && ctx.duration !== undefined && ctx.duration >= condition.duration) {\n return true\n }\n if (condition.path && ctx.path && matchesPattern(ctx.path, condition.path)) {\n return true\n }\n return false\n })\n}\n\nfunction emitWideEvent(level: LogLevel, event: Record<string, unknown>, deferDrain = false, ownsEvent = false): WideEvent | null {\n if (!globalEnabled) return null\n\n if (!ownsEvent && !shouldSample(level)) {\n return null\n }\n\n let formatted: WideEvent\n if (ownsEvent) {\n event.timestamp = isoNow()\n event.level = level\n if (event.service === undefined) event.service = globalEnv.service\n if (event.environment === undefined) event.environment = globalEnv.environment\n if (globalEnv.version !== undefined && event.version === undefined) event.version = globalEnv.version\n if (globalEnv.commitHash !== undefined && event.commitHash === undefined) event.commitHash = globalEnv.commitHash\n if (globalEnv.region !== undefined && event.region === undefined) event.region = globalEnv.region\n formatted = event as WideEvent\n } else {\n formatted = {\n timestamp: isoNow(),\n level,\n ...globalEnv,\n ...event,\n }\n }\n\n if (!globalSilent) {\n if (globalPretty) {\n prettyPrintWideEvent(formatted)\n } else if (globalStringify) {\n console[getConsoleMethod(level)](JSON.stringify(formatted))\n } else {\n console[getConsoleMethod(level)](formatted)\n }\n }\n\n if (globalDrain && !deferDrain) {\n Promise.resolve(globalDrain({ event: formatted })).catch((err) => {\n console.error('[evlog] drain failed:', err)\n })\n }\n\n return formatted\n}\n\nfunction emitTaggedLog(level: LogLevel, tag: string, message: string): void {\n if (!globalEnabled) return\n\n if (globalPretty && !globalSilent) {\n if (!shouldSample(level)) {\n return\n }\n\n if (isClient()) {\n const levelColor = getCssLevelColor(level)\n const timestamp = isoNow().slice(11, 23)\n console.log(\n `%c${timestamp}%c %c[${escapeFormatString(tag)}]%c ${escapeFormatString(message)}`,\n cssColors.dim,\n cssColors.reset,\n levelColor,\n cssColors.reset,\n )\n } else {\n const color = getLevelColor(level)\n const timestamp = isoNow().slice(11, 23)\n console.log(`${colors.dim}${timestamp}${colors.reset} ${color}[${tag}]${colors.reset} ${message}`)\n }\n\n return\n }\n emitWideEvent(level, { tag, message })\n}\n\nfunction formatValue(value: unknown): string {\n if (value === null || value === undefined) {\n return String(value)\n }\n if (typeof value === 'object') {\n // Flatten object to key=value pairs\n const pairs: string[] = []\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (v !== undefined && v !== null) {\n if (typeof v === 'object') {\n // For nested objects, show as JSON\n pairs.push(`${k}=${JSON.stringify(v)}`)\n } else {\n pairs.push(`${k}=${v}`)\n }\n }\n }\n return pairs.join(' ')\n }\n return String(value)\n}\n\nfunction prettyPrintWideEvent(event: Record<string, unknown>): void {\n const { timestamp, level, service, environment, version, ...rest } = event\n const ts = (timestamp as string).slice(11, 23)\n const browser = isClient()\n\n const parts: string[] = []\n const styles: string[] = []\n\n if (browser) {\n const lc = getCssLevelColor(level as string)\n parts.push(`%c${ts}%c %c${(level as string).toUpperCase()}%c %c[${escapeFormatString(String(service))}]%c`)\n styles.push(cssColors.dim, cssColors.reset, lc, cssColors.reset, cssColors.cyan, cssColors.reset)\n } else {\n const lc = getLevelColor(level as string)\n parts.push(`${colors.dim}${ts}${colors.reset} ${lc}${(level as string).toUpperCase()}${colors.reset} ${colors.cyan}[${service}]${colors.reset}`)\n }\n\n if (rest.method && rest.path) {\n parts.push(browser ? ` ${escapeFormatString(String(rest.method))} ${escapeFormatString(String(rest.path))}` : ` ${rest.method} ${rest.path}`)\n delete rest.method\n delete rest.path\n }\n\n if (rest.status) {\n const sc = browser\n ? ((rest.status as number) >= 400 ? cssColors.red : cssColors.green)\n : ((rest.status as number) >= 400 ? colors.red : colors.green)\n if (browser) {\n parts.push(` %c${rest.status}%c`)\n styles.push(sc, cssColors.reset)\n } else {\n parts.push(` ${sc}${rest.status}${colors.reset}`)\n }\n delete rest.status\n }\n\n if (rest.duration) {\n if (browser) {\n parts.push(` %c${escapeFormatString(`in ${rest.duration}`)}%c`)\n styles.push(cssColors.dim, cssColors.reset)\n } else {\n parts.push(` ${colors.dim}in ${rest.duration}${colors.reset}`)\n }\n delete rest.duration\n }\n\n console.log(parts.join(''), ...styles)\n\n const entries = Object.entries(rest).filter(([_, v]) => v !== undefined)\n const lastIndex = entries.length - 1\n\n entries.forEach(([key, value], index) => {\n const prefix = index === lastIndex ? '└─' : '├─'\n const val = formatValue(value)\n if (browser) {\n console.log(` %c${prefix}%c %c${escapeFormatString(key)}:%c ${escapeFormatString(val)}`, cssColors.dim, cssColors.reset, cssColors.cyan, cssColors.reset)\n } else {\n console.log(` ${colors.dim}${prefix}${colors.reset} ${colors.cyan}${key}:${colors.reset} ${val}`)\n }\n })\n}\n\nfunction createLogMethod(level: LogLevel) {\n return function logMethod(tagOrEvent: string | Record<string, unknown>, message?: string): void {\n if (typeof tagOrEvent === 'string' && message !== undefined) {\n emitTaggedLog(level, tagOrEvent, message)\n } else if (typeof tagOrEvent === 'object') {\n emitWideEvent(level, tagOrEvent)\n } else {\n emitTaggedLog(level, 'log', String(tagOrEvent))\n }\n }\n}\n\n/**\n * Simple logging API - as easy as console.log\n *\n * @example\n * ```ts\n * log.info('auth', 'User logged in')\n * log.error({ action: 'payment', error: 'failed' })\n * ```\n */\nconst _log: Log = {\n info: createLogMethod('info'),\n error: createLogMethod('error'),\n warn: createLogMethod('warn'),\n debug: createLogMethod('debug'),\n}\n\nexport { _log as log }\n\nconst noopLogger: RequestLogger = {\n set() {},\n error() {},\n info() {},\n warn() {},\n emit() {\n return null\n },\n getContext() {\n return {}\n },\n}\n\n/**\n * @internal Options for createLogger that are not part of the public API.\n */\ninterface CreateLoggerInternalOptions {\n /**\n * When true, the global drain is skipped on emit.\n * Used by framework middleware that runs its own enrich+drain pipeline.\n */\n _deferDrain?: boolean\n}\n\n/**\n * Create a scoped logger for building wide events.\n * Use this for any context: workflows, jobs, scripts, queues, etc.\n *\n * @example\n * ```ts\n * const log = createLogger({ jobId: job.id, queue: 'emails' })\n * log.set({ batch: { size: 50, processed: 12 } })\n * log.emit()\n * ```\n */\nexport function createLogger<T extends object = Record<string, unknown>>(initialContext: Record<string, unknown> = {}, internalOptions?: CreateLoggerInternalOptions): RequestLogger<T> {\n if (!globalEnabled) return noopLogger as RequestLogger<T>\n\n const deferDrain = internalOptions?._deferDrain ?? false\n const startTime = Date.now()\n const context: Record<string, unknown> = { ...initialContext }\n let hasError = false\n let hasWarn = false\n\n function addLog(level: 'info' | 'warn', message: string): void {\n if (!Array.isArray(context.requestLogs)) {\n context.requestLogs = []\n }\n (context.requestLogs as unknown[]).push({\n level,\n message,\n timestamp: isoNow(),\n })\n }\n\n return {\n set(data: FieldContext<T>): void {\n mergeInto(context, data as Record<string, unknown>)\n },\n\n error(error: Error | string, errorContext?: FieldContext<T>): void {\n hasError = true\n const err = typeof error === 'string' ? new Error(error) : error\n\n if (errorContext) {\n mergeInto(context, errorContext as Record<string, unknown>)\n }\n\n const errorObj: Record<string, unknown> = {\n name: err.name,\n message: err.message,\n stack: err.stack,\n }\n const errRecord = err as unknown as Record<string, unknown>\n for (const k of ['status', 'statusText', 'statusCode', 'statusMessage', 'data', 'cause', 'internal'] as const) {\n if (k in err) errorObj[k] = errRecord[k]\n }\n\n if (isPlainObject(context.error)) {\n mergeInto(context.error as Record<string, unknown>, errorObj)\n } else {\n context.error = errorObj\n }\n },\n\n info(message: string, infoContext?: FieldContext<T>): void {\n addLog('info', message)\n if (infoContext) {\n const { requestLogs: _, ...rest } = infoContext as Record<string, unknown>\n mergeInto(context, rest)\n }\n },\n\n warn(message: string, warnContext?: FieldContext<T>): void {\n hasWarn = true\n addLog('warn', message)\n if (warnContext) {\n const { requestLogs: _, ...rest } = warnContext as Record<string, unknown>\n mergeInto(context, rest)\n }\n },\n\n emit(overrides?: FieldContext<T> & { _forceKeep?: boolean }): WideEvent | null {\n const durationMs = Date.now() - startTime\n const level: LogLevel = hasError ? 'error' : hasWarn ? 'warn' : 'info'\n\n let forceKeep = false\n if (overrides?._forceKeep) {\n forceKeep = true\n } else if (globalSampling.keep?.length) {\n const status = (overrides as Record<string, unknown> | undefined)?.status ?? context.status\n forceKeep = shouldKeep({\n status: status as number | undefined,\n duration: durationMs,\n path: context.path as string | undefined,\n method: context.method as string | undefined,\n context,\n })\n }\n\n if (!forceKeep && !shouldSample(level)) {\n return null\n }\n\n if (overrides) {\n const obj = overrides as Record<string, unknown>\n for (const key in obj) {\n if (key !== '_forceKeep') context[key] = obj[key]\n }\n }\n context.duration = formatDuration(durationMs)\n\n return emitWideEvent(level, context, deferDrain, true)\n },\n\n getContext(): FieldContext<T> & Record<string, unknown> {\n return { ...context }\n },\n }\n}\n\n/**\n * Create a request-scoped logger for building wide events.\n * Convenience wrapper around `createLogger` that pre-populates HTTP request fields.\n *\n * @example\n * ```ts\n * const log = createRequestLogger({ method: 'POST', path: '/checkout' })\n * log.set({ user: { id: '123' } })\n * log.set({ cart: { items: 3 } })\n * log.emit()\n * ```\n */\nexport function createRequestLogger<T extends object = Record<string, unknown>>(options: RequestLoggerOptions = {}, internalOptions?: CreateLoggerInternalOptions): RequestLogger<T> {\n const initial: Record<string, unknown> = {}\n if (options.method !== undefined) initial.method = options.method\n if (options.path !== undefined) initial.path = options.path\n if (options.requestId !== undefined) initial.requestId = options.requestId\n return createLogger<T>(initial, internalOptions)\n}\n\n/**\n * Get the current environment context.\n */\nexport function getEnvironment(): EnvironmentContext {\n return { ...globalEnv }\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\ndeclare const __EVLOG_CONFIG__: import('./types').LoggerConfig | undefined\n\nif (typeof __EVLOG_CONFIG__ !== 'undefined') initLogger(__EVLOG_CONFIG__)\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { C as TailSamplingContext, T as WideEvent, g as RequestLogger, i as EnrichContext, r as DrainContext, v as RouteConfig } from "./types-
|
|
1
|
+
import { C as TailSamplingContext, T as WideEvent, g as RequestLogger, i as EnrichContext, r as DrainContext, v as RouteConfig } from "./types-v_JkG_D7.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/shared/middleware.d.ts
|
|
4
4
|
/**
|
|
@@ -72,4 +72,4 @@ interface MiddlewareLoggerResult {
|
|
|
72
72
|
declare function createMiddlewareLogger(options: MiddlewareLoggerOptions): MiddlewareLoggerResult;
|
|
73
73
|
//#endregion
|
|
74
74
|
export { createMiddlewareLogger as i, MiddlewareLoggerOptions as n, MiddlewareLoggerResult as r, BaseEvlogOptions as t };
|
|
75
|
-
//# sourceMappingURL=middleware-
|
|
75
|
+
//# sourceMappingURL=middleware-DojmTj9Y.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware-
|
|
1
|
+
{"version":3,"file":"middleware-DojmTj9Y.d.mts","names":[],"sources":["../src/shared/middleware.ts"],"mappings":";;;;;AAcA;;;;;;;UAAiB,gBAAA;EAgByB;EAdxC,OAAA;EAmB4C;EAjB5C,OAAA;EAiBmD;EAfnD,MAAA,GAAS,MAAA,SAAe,WAAA;EAFxB;;;;EAOA,KAAA,IAAS,GAAA,EAAK,YAAA,YAAwB,OAAA;EAAxB;;;;EAKd,MAAA,IAAU,GAAA,EAAK,aAAA,YAAyB,OAAA;EAA9B;;;;EAKV,IAAA,IAAQ,GAAA,EAAK,mBAAA,YAA+B,OAAA;AAAA;;;AAQ9C;;;UAAiB,uBAAA,SAAgC,gBAAA;EAC/C,MAAA;EACA,IAAA;EACA,SAAA;EAAA;EAEA,OAAA,GAAU,MAAA;AAAA;AAAA,UAGK,sBAAA;EACf,MAAA,EAAQ,aAAA;EACR,MAAA,GAAS,IAAA;IAAS,MAAA;IAAiB,KAAA,GAAQ,KAAA;EAAA,MAAY,OAAA,CAAQ,SAAA;EAC/D,OAAA;AAAA;;;;;;;;;;;;;;;;AAuEF;iBAAgB,sBAAA,CAAuB,OAAA,EAAS,uBAAA,GAA0B,sBAAA"}
|
package/dist/nestjs/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { g as RequestLogger } from "../types-
|
|
2
|
-
import { t as BaseEvlogOptions } from "../middleware-
|
|
1
|
+
import { g as RequestLogger } from "../types-v_JkG_D7.mjs";
|
|
2
|
+
import { t as BaseEvlogOptions } from "../middleware-DojmTj9Y.mjs";
|
|
3
3
|
import { DynamicModule, MiddlewareConsumer, NestModule } from "@nestjs/common";
|
|
4
4
|
|
|
5
5
|
//#region src/nestjs/index.d.ts
|
package/dist/nestjs/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { n as extractSafeNodeHeaders, r as createMiddlewareLogger } from "../headers-
|
|
2
|
-
import { t as createLoggerStorage } from "../storage-
|
|
1
|
+
import { n as extractSafeNodeHeaders, r as createMiddlewareLogger } from "../headers-BSi3UHKL.mjs";
|
|
2
|
+
import { t as createLoggerStorage } from "../storage-B6NPh8rV.mjs";
|
|
3
3
|
//#region src/nestjs/index.ts
|
|
4
4
|
const { storage, useLogger } = createLoggerStorage("middleware context. Make sure EvlogModule.forRoot() is imported in your AppModule.");
|
|
5
5
|
function createEvlogMiddleware(getOptions) {
|
package/dist/next/client.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { w as TransportConfig } from "../types-
|
|
1
|
+
import { w as TransportConfig } from "../types-v_JkG_D7.mjs";
|
|
2
2
|
import { clearIdentity, log as _clientLog, setIdentity } from "../runtime/client/log.mjs";
|
|
3
|
-
import * as react from "react";
|
|
3
|
+
import * as _$react from "react";
|
|
4
4
|
|
|
5
5
|
//#region src/next/client.d.ts
|
|
6
6
|
interface EvlogProviderProps {
|
|
@@ -57,7 +57,7 @@ declare function EvlogProvider({
|
|
|
57
57
|
enabled,
|
|
58
58
|
console: consoleOutput,
|
|
59
59
|
children
|
|
60
|
-
}: EvlogProviderProps): react.ReactNode;
|
|
60
|
+
}: EvlogProviderProps): _$react.ReactNode;
|
|
61
61
|
//#endregion
|
|
62
62
|
export { EvlogProvider, EvlogProviderProps, clearIdentity, _clientLog as log, setIdentity };
|
|
63
63
|
//# sourceMappingURL=client.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.mts","names":[],"sources":["../../src/next/client.ts"],"mappings":";;;;;UAQiB,kBAAA;;;AAAjB;;EAKE,OAAA;EA2ByB;;;;EArBzB,MAAA;EAWA;;;EANA,SAAA,GAAY,eAAA;EAgBI;;;AAsBlB;EAhCE,OAAA;;;;;;;EAQA,OAAA;EAEA,QAAA,EAAU,KAAA,CAAM,SAAA;AAAA;;;;;;;;;;;;;;;;;;;iBAsBF,aAAA,CAAA;EAAgB,OAAA;EAAS,MAAA;EAAQ,SAAA;EAAW,OAAA;EAAS,OAAA,EAAS,aAAA;EAAe;AAAA,GAAY,kBAAA,GAAkB,
|
|
1
|
+
{"version":3,"file":"client.d.mts","names":[],"sources":["../../src/next/client.ts"],"mappings":";;;;;UAQiB,kBAAA;;;AAAjB;;EAKE,OAAA;EA2ByB;;;;EArBzB,MAAA;EAWA;;;EANA,SAAA,GAAY,eAAA;EAgBI;;;AAsBlB;EAhCE,OAAA;;;;;;;EAQA,OAAA;EAEA,QAAA,EAAU,KAAA,CAAM,SAAA;AAAA;;;;;;;;;;;;;;;;;;;iBAsBF,aAAA,CAAA;EAAgB,OAAA;EAAS,MAAA;EAAQ,SAAA;EAAW,OAAA;EAAS,OAAA,EAAS,aAAA;EAAe;AAAA,GAAY,kBAAA,GAAkB,OAAA,CAAA,SAAA"}
|
package/dist/next/index.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { a as EnvironmentContext, d as Log, g as RequestLogger, y as SamplingConfig } from "../types-
|
|
2
|
-
import { n as createError } from "../error-
|
|
3
|
-
import { t as _log } from "../logger-
|
|
4
|
-
import { t as BaseEvlogOptions } from "../middleware-
|
|
1
|
+
import { a as EnvironmentContext, d as Log, g as RequestLogger, y as SamplingConfig } from "../types-v_JkG_D7.mjs";
|
|
2
|
+
import { n as createError } from "../error-plrBYLQk.mjs";
|
|
3
|
+
import { t as _log } from "../logger-CG1eop2_.mjs";
|
|
4
|
+
import { t as BaseEvlogOptions } from "../middleware-DojmTj9Y.mjs";
|
|
5
5
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
6
6
|
|
|
7
7
|
//#region src/next/types.d.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/next/types.ts","../../src/next/storage.ts","../../src/next/middleware.ts","../../src/next/index.ts"],"mappings":";;;;;;;UAGiB,gBAAA,SAAyB,gBAAA;;;;;EAKxC,OAAA;;;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/next/types.ts","../../src/next/storage.ts","../../src/next/middleware.ts","../../src/next/index.ts"],"mappings":";;;;;;;UAGiB,gBAAA,SAAyB,gBAAA;;;;;EAKxC,OAAA;EALe;;;EAUf,GAAA,GAAM,OAAA,CAAQ,kBAAA;EAAR;;;;EAMN,MAAA;EAhBwC;;;;EAsBxC,OAAA;EANA;;;EAWA,QAAA,GAAW,cAAA;EAMX;;;;EAAA,SAAA;EAUoC;;;;;EAHpC,MAAA;AAAA;AAAA,UAGe,qBAAA;EC1BQ;;;;ED+BvB,OAAA;EC/BoF;;;;EDqCpF,OAAA;AAAA;;;;;;;;AAtDF;;;;;;;;;;iBCiBgB,SAAA,oBAA6B,MAAA,kBAAA,CAAA,GAA4B,aAAA,CAAc,CAAA;;;KCjBlF,WAAA;EACH,OAAA;IAAW,QAAA;EAAA;EACX,OAAA;IAAW,GAAA,CAAI,IAAA;EAAA;AAAA;AAAA,KAGZ,YAAA;EACH,OAAA;IAAW,GAAA,CAAI,IAAA,UAAc,KAAA;EAAA;AAAA;;;;;;;;;;;;;;iBAoBf,eAAA,CAAgB,MAAA,GAAS,qBAAA,IACzB,OAAA,EAAS,WAAA,KAAW,OAAA,CAAA,YAAA;;;AF3BpC;;;;;;;;;;;;;;;;;;;;;;AA2CA;;;;;;;AA3CA,iBGuCgB,WAAA,CAAY,OAAA,GAAS,gBAAA;6DAWuuE,IAAA,EAAA,KAAA,KAAA,OAAA,SAAkC,IAAA,EAAA,KAAA,KAAA,OAAA,CAAA,OAAA,CAAA,OAAA"}
|
package/dist/next/index.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { filterSafeHeaders } from "../utils.mjs";
|
|
2
2
|
import { EvlogError, createError } from "../error.mjs";
|
|
3
|
-
import { createRequestLogger, getGlobalDrain, initLogger, isEnabled, log as _log } from "../logger.mjs";
|
|
4
|
-
import { n as shouldLog, t as getServiceForPath } from "../routes-
|
|
3
|
+
import { createRequestLogger, getGlobalDrain, initLogger, isEnabled, isLoggerLocked, log as _log } from "../logger.mjs";
|
|
4
|
+
import { n as shouldLog, t as getServiceForPath } from "../routes-CE3_c-iZ.mjs";
|
|
5
5
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
6
6
|
//#region src/next/storage.ts
|
|
7
7
|
const evlogStorage = new AsyncLocalStorage();
|
|
@@ -34,6 +34,7 @@ const state = {
|
|
|
34
34
|
function configureHandler(options) {
|
|
35
35
|
state.options = options;
|
|
36
36
|
state.initialized = true;
|
|
37
|
+
if (isLoggerLocked()) return;
|
|
37
38
|
initLogger({
|
|
38
39
|
enabled: options.enabled,
|
|
39
40
|
env: {
|