evlog 1.6.0 → 1.8.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 +96 -0
- package/dist/_http-DVDwNag0.mjs +76 -0
- package/dist/_http-DVDwNag0.mjs.map +1 -0
- package/dist/_severity-CXfyvxQi.mjs +17 -0
- package/dist/_severity-CXfyvxQi.mjs.map +1 -0
- package/dist/adapters/axiom.d.mts +17 -15
- package/dist/adapters/axiom.d.mts.map +1 -0
- package/dist/adapters/axiom.mjs +91 -50
- package/dist/adapters/axiom.mjs.map +1 -0
- package/dist/adapters/better-stack.d.mts +63 -0
- package/dist/adapters/better-stack.d.mts.map +1 -0
- package/dist/adapters/better-stack.mjs +98 -0
- package/dist/adapters/better-stack.mjs.map +1 -0
- package/dist/adapters/otlp.d.mts +32 -30
- package/dist/adapters/otlp.d.mts.map +1 -0
- package/dist/adapters/otlp.mjs +181 -181
- package/dist/adapters/otlp.mjs.map +1 -0
- package/dist/adapters/posthog.d.mts +54 -19
- package/dist/adapters/posthog.d.mts.map +1 -0
- package/dist/adapters/posthog.mjs +156 -63
- package/dist/adapters/posthog.mjs.map +1 -0
- package/dist/adapters/sentry.d.mts +25 -23
- package/dist/adapters/sentry.d.mts.map +1 -0
- package/dist/adapters/sentry.mjs +198 -153
- package/dist/adapters/sentry.mjs.map +1 -0
- package/dist/browser.d.mts +63 -0
- package/dist/browser.d.mts.map +1 -0
- package/dist/browser.mjs +95 -0
- package/dist/browser.mjs.map +1 -0
- package/dist/enrichers.d.mts +74 -0
- package/dist/enrichers.d.mts.map +1 -0
- package/dist/enrichers.mjs +172 -0
- package/dist/enrichers.mjs.map +1 -0
- package/dist/error.d.mts +24 -22
- package/dist/error.d.mts.map +1 -0
- package/dist/error.mjs +107 -76
- package/dist/error.mjs.map +1 -0
- package/dist/index.d.mts +6 -5
- package/dist/index.mjs +6 -5
- package/dist/logger.d.mts +11 -5
- package/dist/logger.d.mts.map +1 -0
- package/dist/logger.mjs +255 -186
- package/dist/logger.mjs.map +1 -0
- package/dist/nitro/errorHandler.d.mts +4 -2
- package/dist/nitro/errorHandler.d.mts.map +1 -0
- package/dist/nitro/errorHandler.mjs +38 -38
- package/dist/nitro/errorHandler.mjs.map +1 -0
- package/dist/nitro/module.d.mts +11 -0
- package/dist/nitro/module.d.mts.map +1 -0
- package/dist/nitro/module.mjs +23 -0
- package/dist/nitro/module.mjs.map +1 -0
- package/dist/nitro/plugin.d.mts +4 -2
- package/dist/nitro/plugin.d.mts.map +1 -0
- package/dist/nitro/plugin.mjs +135 -140
- package/dist/nitro/plugin.mjs.map +1 -0
- package/dist/nitro/v3/errorHandler.d.mts +24 -0
- package/dist/nitro/v3/errorHandler.d.mts.map +1 -0
- package/dist/nitro/v3/errorHandler.mjs +36 -0
- package/dist/nitro/v3/errorHandler.mjs.map +1 -0
- package/dist/nitro/v3/index.d.mts +4 -0
- package/dist/nitro/v3/index.mjs +4 -0
- package/dist/nitro/v3/module.d.mts +10 -0
- package/dist/nitro/v3/module.d.mts.map +1 -0
- package/dist/nitro/v3/module.mjs +22 -0
- package/dist/nitro/v3/module.mjs.map +1 -0
- package/dist/nitro/v3/plugin.d.mts +14 -0
- package/dist/nitro/v3/plugin.d.mts.map +1 -0
- package/dist/nitro/v3/plugin.mjs +157 -0
- package/dist/nitro/v3/plugin.mjs.map +1 -0
- package/dist/nitro/v3/useLogger.d.mts +24 -0
- package/dist/nitro/v3/useLogger.d.mts.map +1 -0
- package/dist/nitro/v3/useLogger.mjs +27 -0
- package/dist/nitro/v3/useLogger.mjs.map +1 -0
- package/dist/nitro-D57TWGyN.mjs +73 -0
- package/dist/nitro-D57TWGyN.mjs.map +1 -0
- package/dist/nitro-D81NBVPi.d.mts +42 -0
- package/dist/nitro-D81NBVPi.d.mts.map +1 -0
- package/dist/nuxt/module.d.mts +155 -168
- package/dist/nuxt/module.d.mts.map +1 -0
- package/dist/nuxt/module.mjs +75 -65
- package/dist/nuxt/module.mjs.map +1 -0
- package/dist/pipeline.d.mts +46 -0
- package/dist/pipeline.d.mts.map +1 -0
- package/dist/pipeline.mjs +122 -0
- package/dist/pipeline.mjs.map +1 -0
- package/dist/runtime/client/log.d.mts +12 -7
- package/dist/runtime/client/log.d.mts.map +1 -0
- package/dist/runtime/client/log.mjs +72 -64
- package/dist/runtime/client/log.mjs.map +1 -0
- package/dist/runtime/client/plugin.d.mts +3 -1
- package/dist/runtime/client/plugin.d.mts.map +1 -0
- package/dist/runtime/client/plugin.mjs +14 -12
- package/dist/runtime/client/plugin.mjs.map +1 -0
- package/dist/runtime/server/routes/_evlog/ingest.post.d.mts +4 -2
- package/dist/runtime/server/routes/_evlog/ingest.post.d.mts.map +1 -0
- package/dist/runtime/server/routes/_evlog/ingest.post.mjs +113 -76
- package/dist/runtime/server/routes/_evlog/ingest.post.mjs.map +1 -0
- package/dist/runtime/server/useLogger.d.mts +14 -3
- package/dist/runtime/server/useLogger.d.mts.map +1 -0
- package/dist/runtime/server/useLogger.mjs +39 -10
- package/dist/runtime/server/useLogger.mjs.map +1 -0
- package/dist/runtime/utils/parseError.d.mts +5 -3
- package/dist/runtime/utils/parseError.d.mts.map +1 -0
- package/dist/runtime/utils/parseError.mjs +25 -26
- package/dist/runtime/utils/parseError.mjs.map +1 -0
- package/dist/types.d.mts +378 -246
- package/dist/types.d.mts.map +1 -0
- package/dist/types.mjs +1 -1
- package/dist/utils.d.mts +19 -14
- package/dist/utils.d.mts.map +1 -0
- package/dist/utils.mjs +59 -50
- package/dist/utils.mjs.map +1 -0
- package/dist/workers.d.mts +10 -9
- package/dist/workers.d.mts.map +1 -0
- package/dist/workers.mjs +68 -39
- package/dist/workers.mjs.map +1 -0
- package/package.json +55 -10
- package/dist/adapters/axiom.d.ts +0 -62
- package/dist/adapters/otlp.d.ts +0 -83
- package/dist/adapters/posthog.d.ts +0 -72
- package/dist/adapters/sentry.d.ts +0 -78
- package/dist/error.d.ts +0 -63
- package/dist/index.d.ts +0 -5
- package/dist/logger.d.ts +0 -40
- package/dist/nitro/errorHandler.d.ts +0 -13
- package/dist/nitro/plugin.d.ts +0 -5
- package/dist/nuxt/module.d.ts +0 -171
- package/dist/runtime/client/log.d.ts +0 -10
- package/dist/runtime/client/plugin.d.ts +0 -3
- package/dist/runtime/server/routes/_evlog/ingest.post.d.ts +0 -5
- package/dist/runtime/server/useLogger.d.ts +0 -28
- package/dist/runtime/utils/parseError.d.ts +0 -5
- package/dist/shared/evlog.Bc35pxiY.mjs +0 -10
- package/dist/types.d.ts +0 -364
- package/dist/utils.d.ts +0 -29
- package/dist/workers.d.ts +0 -45
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { filterSafeHeaders } from "../../utils.mjs";
|
|
2
|
+
import { createRequestLogger, initLogger, isEnabled } from "../../logger.mjs";
|
|
3
|
+
import { a as shouldLog, n as getServiceForPath, t as extractErrorStatus } from "../../nitro-D57TWGyN.mjs";
|
|
4
|
+
import { definePlugin } from "nitro";
|
|
5
|
+
import { useRuntimeConfig } from "nitro/runtime-config";
|
|
6
|
+
import { parseURL } from "ufo";
|
|
7
|
+
|
|
8
|
+
//#region src/nitro-v3/plugin.ts
|
|
9
|
+
function getContext(event) {
|
|
10
|
+
if (!event.req.context) event.req.context = {};
|
|
11
|
+
return event.req.context;
|
|
12
|
+
}
|
|
13
|
+
function getSafeRequestHeaders(event) {
|
|
14
|
+
const headers = {};
|
|
15
|
+
event.req.headers.forEach((value, key) => {
|
|
16
|
+
headers[key] = value;
|
|
17
|
+
});
|
|
18
|
+
return filterSafeHeaders(headers);
|
|
19
|
+
}
|
|
20
|
+
function getSafeResponseHeaders(res) {
|
|
21
|
+
const headers = {};
|
|
22
|
+
res.headers.forEach((value, key) => {
|
|
23
|
+
headers[key] = value;
|
|
24
|
+
});
|
|
25
|
+
if (Object.keys(headers).length === 0) return void 0;
|
|
26
|
+
return filterSafeHeaders(headers);
|
|
27
|
+
}
|
|
28
|
+
function buildHookContext(event, res) {
|
|
29
|
+
const { pathname } = parseURL(event.req.url);
|
|
30
|
+
const responseHeaders = res ? getSafeResponseHeaders(res) : void 0;
|
|
31
|
+
return {
|
|
32
|
+
request: {
|
|
33
|
+
method: event.req.method,
|
|
34
|
+
path: pathname
|
|
35
|
+
},
|
|
36
|
+
headers: getSafeRequestHeaders(event),
|
|
37
|
+
response: {
|
|
38
|
+
status: res?.status ?? 200,
|
|
39
|
+
headers: responseHeaders
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function callDrainHook(hooks, emittedEvent, event, hookContext) {
|
|
44
|
+
if (!emittedEvent) return;
|
|
45
|
+
let drainPromise;
|
|
46
|
+
try {
|
|
47
|
+
drainPromise = hooks.callHook("evlog:drain", {
|
|
48
|
+
event: emittedEvent,
|
|
49
|
+
request: hookContext.request,
|
|
50
|
+
headers: hookContext.headers
|
|
51
|
+
});
|
|
52
|
+
} catch (err) {
|
|
53
|
+
console.error("[evlog] drain failed:", err);
|
|
54
|
+
}
|
|
55
|
+
if (drainPromise && typeof event.req.waitUntil === "function") event.req.waitUntil(drainPromise);
|
|
56
|
+
}
|
|
57
|
+
async function callEnrichAndDrain(hooks, emittedEvent, event, res) {
|
|
58
|
+
if (!emittedEvent) return;
|
|
59
|
+
const hookContext = buildHookContext(event, res);
|
|
60
|
+
try {
|
|
61
|
+
await hooks.callHook("evlog:enrich", {
|
|
62
|
+
event: emittedEvent,
|
|
63
|
+
...hookContext
|
|
64
|
+
});
|
|
65
|
+
} catch (err) {
|
|
66
|
+
console.error("[evlog] enrich failed:", err);
|
|
67
|
+
}
|
|
68
|
+
callDrainHook(hooks, emittedEvent, event, hookContext);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Nitro v3 plugin entry point.
|
|
72
|
+
*
|
|
73
|
+
* Usage in Nitro v3:
|
|
74
|
+
* ```ts
|
|
75
|
+
* // plugins/evlog.ts
|
|
76
|
+
* export { default } from 'evlog/nitro/v3'
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
var plugin_default = definePlugin((nitroApp) => {
|
|
80
|
+
const evlogConfig = useRuntimeConfig().evlog ?? (process.env.__EVLOG_CONFIG ? JSON.parse(process.env.__EVLOG_CONFIG) : void 0);
|
|
81
|
+
initLogger({
|
|
82
|
+
enabled: evlogConfig?.enabled,
|
|
83
|
+
env: evlogConfig?.env,
|
|
84
|
+
pretty: evlogConfig?.pretty,
|
|
85
|
+
sampling: evlogConfig?.sampling
|
|
86
|
+
});
|
|
87
|
+
if (!isEnabled()) return;
|
|
88
|
+
const hooks = nitroApp.hooks;
|
|
89
|
+
hooks.hook("request", (event) => {
|
|
90
|
+
const { pathname } = parseURL(event.req.url);
|
|
91
|
+
if (!shouldLog(pathname, evlogConfig?.include, evlogConfig?.exclude)) return;
|
|
92
|
+
const ctx = getContext(event);
|
|
93
|
+
ctx._evlogStartTime = Date.now();
|
|
94
|
+
let requestIdOverride = void 0;
|
|
95
|
+
if (globalThis.navigator?.userAgent === "Cloudflare-Workers") {
|
|
96
|
+
const cfRay = event.req.headers.get("cf-ray");
|
|
97
|
+
if (cfRay) requestIdOverride = cfRay;
|
|
98
|
+
}
|
|
99
|
+
const log = createRequestLogger({
|
|
100
|
+
method: event.req.method,
|
|
101
|
+
path: pathname,
|
|
102
|
+
requestId: requestIdOverride || ctx.requestId || crypto.randomUUID()
|
|
103
|
+
});
|
|
104
|
+
const routeService = getServiceForPath(pathname, evlogConfig?.routes);
|
|
105
|
+
if (routeService) log.set({ service: routeService });
|
|
106
|
+
ctx.log = log;
|
|
107
|
+
});
|
|
108
|
+
hooks.hook("response", async (res, event) => {
|
|
109
|
+
const ctx = event.req.context;
|
|
110
|
+
if (ctx?._evlogEmitted) return;
|
|
111
|
+
const log = ctx?.log;
|
|
112
|
+
if (!log || !ctx) return;
|
|
113
|
+
const { status } = res;
|
|
114
|
+
log.set({ status });
|
|
115
|
+
const startTime = ctx._evlogStartTime;
|
|
116
|
+
const durationMs = startTime ? Date.now() - startTime : void 0;
|
|
117
|
+
const { pathname } = parseURL(event.req.url);
|
|
118
|
+
const tailCtx = {
|
|
119
|
+
status,
|
|
120
|
+
duration: durationMs,
|
|
121
|
+
path: pathname,
|
|
122
|
+
method: event.req.method,
|
|
123
|
+
context: log.getContext(),
|
|
124
|
+
shouldKeep: false
|
|
125
|
+
};
|
|
126
|
+
await hooks.callHook("evlog:emit:keep", tailCtx);
|
|
127
|
+
await callEnrichAndDrain(hooks, log.emit({ _forceKeep: tailCtx.shouldKeep }), event, res);
|
|
128
|
+
});
|
|
129
|
+
hooks.hook("error", async (error, { event }) => {
|
|
130
|
+
if (!event) return;
|
|
131
|
+
const e = event;
|
|
132
|
+
const ctx = e.req.context;
|
|
133
|
+
const log = ctx?.log;
|
|
134
|
+
if (!log || !ctx) return;
|
|
135
|
+
const actualError = error.cause?.name === "EvlogError" ? error.cause : error;
|
|
136
|
+
log.error(actualError);
|
|
137
|
+
const errorStatus = extractErrorStatus(actualError);
|
|
138
|
+
log.set({ status: errorStatus });
|
|
139
|
+
const { pathname } = parseURL(e.req.url);
|
|
140
|
+
const startTime = ctx._evlogStartTime;
|
|
141
|
+
const tailCtx = {
|
|
142
|
+
status: errorStatus,
|
|
143
|
+
duration: startTime ? Date.now() - startTime : void 0,
|
|
144
|
+
path: pathname,
|
|
145
|
+
method: e.req.method,
|
|
146
|
+
context: log.getContext(),
|
|
147
|
+
shouldKeep: false
|
|
148
|
+
};
|
|
149
|
+
await hooks.callHook("evlog:emit:keep", tailCtx);
|
|
150
|
+
ctx._evlogEmitted = true;
|
|
151
|
+
await callEnrichAndDrain(hooks, log.emit({ _forceKeep: tailCtx.shouldKeep }), e);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
//#endregion
|
|
156
|
+
export { plugin_default as default };
|
|
157
|
+
//# sourceMappingURL=plugin.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.mjs","names":[],"sources":["../../../src/nitro-v3/plugin.ts"],"sourcesContent":["import { definePlugin } from 'nitro'\nimport { useRuntimeConfig } from 'nitro/runtime-config'\nimport type { CaptureError } from 'nitro/types'\nimport type { HTTPEvent } from 'nitro/h3'\nimport { parseURL } from 'ufo'\nimport { createRequestLogger, initLogger, isEnabled } from '../logger'\nimport { shouldLog, getServiceForPath, extractErrorStatus } from '../nitro'\nimport type { EvlogConfig } from '../nitro'\nimport type { EnrichContext, RequestLogger, TailSamplingContext, WideEvent } from '../types'\nimport { filterSafeHeaders } from '../utils'\n\n// Nitro v3 doesn't fully export hook types yet\n// https://github.com/nitrojs/nitro/blob/8882bc9e1dbf2d342e73097f22a2156f70f50575/src/types/runtime/nitro.ts#L48-L53\ninterface NitroV3Hooks {\n close: () => void\n error: CaptureError\n request: (event: HTTPEvent) => void | Promise<void>\n response: (res: Response, event: HTTPEvent) => void | Promise<void>\n 'evlog:emit:keep': (ctx: TailSamplingContext) => void | Promise<void>\n 'evlog:enrich': (ctx: EnrichContext) => void | Promise<void>\n 'evlog:drain': (ctx: { event: WideEvent; request?: { method?: string; path: string; requestId?: string }; headers?: Record<string, string> }) => void | Promise<void>\n}\n\ntype Hooks = {\n hook: <T extends keyof NitroV3Hooks>(name: T, listener: NitroV3Hooks[T]) => void\n callHook: <T extends keyof NitroV3Hooks>(name: T, ...args: Parameters<NitroV3Hooks[T]>) => Promise<void>\n}\n\nfunction getContext(event: HTTPEvent): Record<string, unknown> {\n if (!event.req.context) {\n event.req.context = {}\n }\n return event.req.context\n}\n\nfunction getSafeRequestHeaders(event: HTTPEvent): Record<string, string> {\n const headers: Record<string, string> = {}\n event.req.headers.forEach((value, key) => {\n headers[key] = value\n })\n return filterSafeHeaders(headers)\n}\n\nfunction getSafeResponseHeaders(res: Response): Record<string, string> | undefined {\n const headers: Record<string, string> = {}\n res.headers.forEach((value, key) => {\n headers[key] = value\n })\n if (Object.keys(headers).length === 0) return undefined\n return filterSafeHeaders(headers)\n}\n\nfunction buildHookContext(\n event: HTTPEvent,\n res?: Response,\n): Omit<EnrichContext, 'event'> {\n const { pathname } = parseURL(event.req.url)\n const responseHeaders = res ? getSafeResponseHeaders(res) : undefined\n return {\n request: { method: event.req.method, path: pathname },\n headers: getSafeRequestHeaders(event),\n response: {\n status: res?.status ?? 200,\n headers: responseHeaders,\n },\n }\n}\n\nfunction callDrainHook(\n hooks: Hooks,\n emittedEvent: WideEvent | null,\n event: HTTPEvent,\n hookContext: Omit<EnrichContext, 'event'>,\n): void {\n if (!emittedEvent) return\n let drainPromise: Promise<any> | undefined\n try {\n drainPromise = hooks.callHook('evlog:drain', {\n event: emittedEvent,\n request: hookContext.request,\n headers: hookContext.headers,\n })\n } catch (err) {\n console.error('[evlog] drain failed:', err)\n }\n\n // Use waitUntil if available (srvx native — Cloudflare Workers, Vercel Edge, etc.)\n // This ensures drains complete before the runtime terminates\n if (drainPromise && typeof event.req.waitUntil === 'function') {\n event.req.waitUntil(drainPromise)\n }\n}\n\nasync function callEnrichAndDrain(\n hooks: Hooks,\n emittedEvent: WideEvent | null,\n event: HTTPEvent,\n res?: Response,\n): Promise<void> {\n if (!emittedEvent) return\n\n const hookContext = buildHookContext(event, res)\n\n try {\n await hooks.callHook('evlog:enrich', { event: emittedEvent, ...hookContext })\n } catch (err) {\n console.error('[evlog] enrich failed:', err)\n }\n\n callDrainHook(hooks, emittedEvent, event, hookContext)\n}\n\n/**\n * Nitro v3 plugin entry point.\n *\n * Usage in Nitro v3:\n * ```ts\n * // plugins/evlog.ts\n * export { default } from 'evlog/nitro/v3'\n * ```\n */\nexport default definePlugin((nitroApp) => {\n // In production builds the plugin is bundled and useRuntimeConfig()\n // resolves the virtual module correctly. In dev mode the plugin is\n // loaded externally so useRuntimeConfig() returns a stub — fall back\n // to the env var bridge set by the module.\n const evlogConfig = (useRuntimeConfig().evlog ?? (process.env.__EVLOG_CONFIG ? JSON.parse(process.env.__EVLOG_CONFIG) : undefined)) as EvlogConfig | undefined\n\n initLogger({\n enabled: evlogConfig?.enabled,\n env: evlogConfig?.env,\n pretty: evlogConfig?.pretty,\n sampling: evlogConfig?.sampling,\n })\n\n if (!isEnabled()) return\n\n const hooks = nitroApp.hooks as unknown as Hooks\n\n hooks.hook('request', (event) => {\n const { pathname } = parseURL(event.req.url)\n\n // Skip logging for routes not matching include/exclude patterns\n if (!shouldLog(pathname, evlogConfig?.include, evlogConfig?.exclude)) {\n return\n }\n\n const ctx = getContext(event)\n\n // Store start time for duration calculation in tail sampling\n ctx._evlogStartTime = Date.now()\n\n let requestIdOverride: string | undefined = undefined\n if (globalThis.navigator?.userAgent === 'Cloudflare-Workers') {\n const cfRay = event.req.headers.get('cf-ray')\n if (cfRay) requestIdOverride = cfRay\n }\n\n const log = createRequestLogger({\n method: event.req.method,\n path: pathname,\n requestId: requestIdOverride || ctx.requestId as string | undefined || crypto.randomUUID(),\n })\n\n // Apply route-based service configuration if a matching route is found\n const routeService = getServiceForPath(pathname, evlogConfig?.routes)\n if (routeService) {\n log.set({ service: routeService })\n }\n\n ctx.log = log\n })\n\n hooks.hook('response', async (res, event) => {\n const ctx = event.req.context\n // Skip if already emitted by error hook\n if (ctx?._evlogEmitted) return\n\n const log = ctx?.log as RequestLogger | undefined\n if (!log || !ctx) return\n\n const { status } = res\n log.set({ status })\n\n const startTime = ctx._evlogStartTime as number | undefined\n const durationMs = startTime ? Date.now() - startTime : undefined\n\n const { pathname } = parseURL(event.req.url)\n\n const tailCtx: TailSamplingContext = {\n status,\n duration: durationMs,\n path: pathname,\n method: event.req.method,\n context: log.getContext(),\n shouldKeep: false,\n }\n\n await hooks.callHook('evlog:emit:keep', tailCtx)\n\n const emittedEvent = log.emit({ _forceKeep: tailCtx.shouldKeep })\n await callEnrichAndDrain(hooks, emittedEvent, event, res)\n })\n\n hooks.hook('error', async (error, { event }) => {\n if (!event) return\n const e = event as HTTPEvent\n\n const ctx = e.req.context\n const log = ctx?.log as RequestLogger | undefined\n if (!log || !ctx) return\n\n // Check if error.cause is an EvlogError (thrown errors get wrapped in HTTPError by nitro)\n const actualError = (error.cause as Error)?.name === 'EvlogError' \n ? error.cause as Error \n : error as Error\n\n log.error(actualError)\n\n const errorStatus = extractErrorStatus(actualError)\n log.set({ status: errorStatus })\n\n const { pathname } = parseURL(e.req.url)\n const startTime = ctx._evlogStartTime as number | undefined\n const durationMs = startTime ? Date.now() - startTime : undefined\n\n const tailCtx: TailSamplingContext = {\n status: errorStatus,\n duration: durationMs,\n path: pathname,\n method: e.req.method,\n context: log.getContext(),\n shouldKeep: false,\n }\n\n await hooks.callHook('evlog:emit:keep', tailCtx)\n\n ctx._evlogEmitted = true\n\n const emittedEvent = log.emit({ _forceKeep: tailCtx.shouldKeep })\n await callEnrichAndDrain(hooks, emittedEvent, e)\n })\n})\n"],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { RequestLogger } from "../../types.mjs";
|
|
2
|
+
import { HTTPEvent } from "nitro/h3";
|
|
3
|
+
|
|
4
|
+
//#region src/nitro-v3/useLogger.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Returns the request logger attached to the given Nitro v3 HTTP event.
|
|
7
|
+
*
|
|
8
|
+
* @param event - The current HTTPEvent from Nitro v3.
|
|
9
|
+
* @param service - Optional service name to override the default service.
|
|
10
|
+
* @returns The request-scoped logger.
|
|
11
|
+
* @throws Error if the logger is not initialized on the event context.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* import { useLogger } from 'evlog/nitro/v3'
|
|
15
|
+
*
|
|
16
|
+
* export default defineHandler((event) => {
|
|
17
|
+
* const log = useLogger(event)
|
|
18
|
+
* log.set({ foo: 'bar' })
|
|
19
|
+
* })
|
|
20
|
+
*/
|
|
21
|
+
declare function useLogger<T extends object = Record<string, unknown>>(event: HTTPEvent, service?: string): RequestLogger<T>;
|
|
22
|
+
//#endregion
|
|
23
|
+
export { useLogger };
|
|
24
|
+
//# sourceMappingURL=useLogger.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLogger.d.mts","names":[],"sources":["../../../src/nitro-v3/useLogger.ts"],"mappings":";;;;;;AAmBA;;;;;;;;;;;;;;iBAAgB,SAAA,oBAA6B,MAAA,kBAAA,CAAyB,KAAA,EAAO,SAAA,EAAW,OAAA,YAAmB,aAAA,CAAc,CAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
//#region src/nitro-v3/useLogger.ts
|
|
2
|
+
/**
|
|
3
|
+
* Returns the request logger attached to the given Nitro v3 HTTP event.
|
|
4
|
+
*
|
|
5
|
+
* @param event - The current HTTPEvent from Nitro v3.
|
|
6
|
+
* @param service - Optional service name to override the default service.
|
|
7
|
+
* @returns The request-scoped logger.
|
|
8
|
+
* @throws Error if the logger is not initialized on the event context.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* import { useLogger } from 'evlog/nitro/v3'
|
|
12
|
+
*
|
|
13
|
+
* export default defineHandler((event) => {
|
|
14
|
+
* const log = useLogger(event)
|
|
15
|
+
* log.set({ foo: 'bar' })
|
|
16
|
+
* })
|
|
17
|
+
*/
|
|
18
|
+
function useLogger(event, service) {
|
|
19
|
+
const log = event.req.context?.log;
|
|
20
|
+
if (!log) throw new Error("[evlog] Logger not initialized. Make sure the evlog Nitro module is registered in nitro.config.ts. Example: modules: [evlog({ env: { service: 'my-app' } })]");
|
|
21
|
+
if (service) log.set({ service });
|
|
22
|
+
return log;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
//#endregion
|
|
26
|
+
export { useLogger };
|
|
27
|
+
//# sourceMappingURL=useLogger.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLogger.mjs","names":[],"sources":["../../../src/nitro-v3/useLogger.ts"],"sourcesContent":["import type { HTTPEvent } from 'nitro/h3'\nimport type { RequestLogger } from '../types'\n\n/**\n * Returns the request logger attached to the given Nitro v3 HTTP event.\n *\n * @param event - The current HTTPEvent from Nitro v3.\n * @param service - Optional service name to override the default service.\n * @returns The request-scoped logger.\n * @throws Error if the logger is not initialized on the event context.\n *\n * @example\n * import { useLogger } from 'evlog/nitro/v3'\n *\n * export default defineHandler((event) => {\n * const log = useLogger(event)\n * log.set({ foo: 'bar' })\n * })\n */\nexport function useLogger<T extends object = Record<string, unknown>>(event: HTTPEvent, service?: string): RequestLogger<T> {\n const ctx = event.req.context as Record<string, unknown> | undefined\n const log = ctx?.log as RequestLogger<T> | undefined\n\n if (!log) {\n throw new Error(\n '[evlog] Logger not initialized. Make sure the evlog Nitro module is registered in nitro.config.ts. '\n + 'Example: modules: [evlog({ env: { service: \\'my-app\\' } })]',\n )\n }\n\n if (service) {\n const untyped = log as unknown as RequestLogger\n untyped.set({ service })\n }\n\n return log\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAmBA,SAAgB,UAAsD,OAAkB,SAAoC;CAE1H,MAAM,MADM,MAAM,IAAI,SACL;AAEjB,KAAI,CAAC,IACH,OAAM,IAAI,MACR,+JAED;AAGH,KAAI,QAEF,CADgB,IACR,IAAI,EAAE,SAAS,CAAC;AAG1B,QAAO"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { matchesPattern } from "./utils.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/nitro.ts
|
|
4
|
+
/**
|
|
5
|
+
* Resolve an EvlogError from an error or its cause chain.
|
|
6
|
+
* Both Nitro v2 (h3) and v3 wrap thrown errors — this unwraps them.
|
|
7
|
+
*/
|
|
8
|
+
function resolveEvlogError(error) {
|
|
9
|
+
if (error.name === "EvlogError") return error;
|
|
10
|
+
if (error.cause?.name === "EvlogError") return error.cause;
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Extract HTTP status from an error, checking both `status` and `statusCode`.
|
|
15
|
+
*/
|
|
16
|
+
function extractErrorStatus(error) {
|
|
17
|
+
return error.status ?? error.statusCode ?? 500;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Build a standard evlog error JSON response body.
|
|
21
|
+
* Used by both v2 and v3 error handlers to ensure consistent shape.
|
|
22
|
+
*/
|
|
23
|
+
function serializeEvlogErrorResponse(error, url) {
|
|
24
|
+
const status = extractErrorStatus(error);
|
|
25
|
+
const { data } = error;
|
|
26
|
+
const statusMessage = error.statusMessage || error.message;
|
|
27
|
+
return {
|
|
28
|
+
url,
|
|
29
|
+
status,
|
|
30
|
+
statusCode: status,
|
|
31
|
+
statusText: statusMessage,
|
|
32
|
+
statusMessage,
|
|
33
|
+
message: error.message,
|
|
34
|
+
error: true,
|
|
35
|
+
...data !== void 0 && { data }
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function shouldLog(path, include, exclude) {
|
|
39
|
+
if (exclude && exclude.length > 0) {
|
|
40
|
+
if (exclude.some((pattern) => matchesPattern(path, pattern))) return false;
|
|
41
|
+
}
|
|
42
|
+
if (!include || include.length === 0) return true;
|
|
43
|
+
return include.some((pattern) => matchesPattern(path, pattern));
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Find the service name for a given path based on route patterns.
|
|
47
|
+
*
|
|
48
|
+
* When multiple patterns match the same path, the first matching pattern wins
|
|
49
|
+
* based on object iteration order. To ensure predictable behavior, order your
|
|
50
|
+
* route patterns from most specific to most general.
|
|
51
|
+
*
|
|
52
|
+
* @param path - The request path to match
|
|
53
|
+
* @param routes - Route configuration mapping patterns to service names
|
|
54
|
+
* @returns The service name for the matching route, or undefined if no match
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```ts
|
|
58
|
+
* // Good: specific patterns first, general patterns last
|
|
59
|
+
* routes: {
|
|
60
|
+
* '/api/auth/admin/**': { service: 'admin-service' },
|
|
61
|
+
* '/api/auth/**': { service: 'auth-service' },
|
|
62
|
+
* '/api/**': { service: 'api-service' },
|
|
63
|
+
* }
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
function getServiceForPath(path, routes) {
|
|
67
|
+
if (!routes) return void 0;
|
|
68
|
+
for (const [pattern, config] of Object.entries(routes)) if (matchesPattern(path, pattern)) return config.service;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
//#endregion
|
|
72
|
+
export { shouldLog as a, serializeEvlogErrorResponse as i, getServiceForPath as n, resolveEvlogError as r, extractErrorStatus as t };
|
|
73
|
+
//# sourceMappingURL=nitro-D57TWGyN.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nitro-D57TWGyN.mjs","names":[],"sources":["../src/nitro.ts"],"sourcesContent":["import type { EnvironmentContext, RouteConfig, SamplingConfig } from './types'\nimport { matchesPattern } from './utils'\n\nexport interface NitroModuleOptions {\n /**\n * Enable or disable all logging globally.\n * @default true\n */\n enabled?: boolean\n\n /**\n * Environment context overrides.\n */\n env?: Partial<EnvironmentContext>\n\n /**\n * Enable pretty printing.\n * @default true in development, false in production\n */\n pretty?: boolean\n\n /**\n * Route patterns to include in logging.\n * Supports glob patterns like '/api/**'.\n * If not set, all routes are logged.\n */\n include?: string[]\n\n /**\n * Route patterns to exclude from logging.\n * Supports glob patterns like '/_nitro/**'.\n * Exclusions take precedence over inclusions.\n */\n exclude?: string[]\n\n /**\n * Route-specific service configuration.\n */\n routes?: Record<string, RouteConfig>\n\n /**\n * Sampling configuration for filtering logs.\n */\n sampling?: SamplingConfig\n}\n\nexport interface EvlogConfig {\n enabled?: boolean\n env?: Record<string, unknown>\n pretty?: boolean\n include?: string[]\n exclude?: string[]\n routes?: Record<string, RouteConfig>\n sampling?: SamplingConfig\n}\n\n/**\n * Resolve an EvlogError from an error or its cause chain.\n * Both Nitro v2 (h3) and v3 wrap thrown errors — this unwraps them.\n */\nexport function resolveEvlogError(error: Error): Error | null {\n if (error.name === 'EvlogError') return error\n if ((error.cause as Error)?.name === 'EvlogError') return error.cause as Error\n return null\n}\n\n/**\n * Extract HTTP status from an error, checking both `status` and `statusCode`.\n */\nexport function extractErrorStatus(error: unknown): number {\n return (error as { status?: number }).status\n ?? (error as { statusCode?: number }).statusCode\n ?? 500\n}\n\n/**\n * Build a standard evlog error JSON response body.\n * Used by both v2 and v3 error handlers to ensure consistent shape.\n */\nexport function serializeEvlogErrorResponse(error: Error, url: string): Record<string, unknown> {\n const status = extractErrorStatus(error)\n const { data } = error as { data?: unknown }\n const statusMessage = (error as { statusMessage?: string }).statusMessage || error.message\n return {\n url,\n status,\n statusCode: status,\n statusText: statusMessage,\n statusMessage,\n message: error.message,\n error: true,\n ...(data !== undefined && { data }),\n }\n}\n\nexport function shouldLog(path: string, include?: string[], exclude?: string[]): boolean {\n // Check exclusions first (they take precedence)\n if (exclude && exclude.length > 0) {\n if (exclude.some(pattern => matchesPattern(path, pattern))) {\n return false\n }\n }\n\n // If no include patterns, log everything (that wasn't excluded)\n if (!include || include.length === 0) {\n return true\n }\n\n // Log only if path matches at least one include pattern\n return include.some(pattern => matchesPattern(path, pattern))\n}\n\n/**\n * Find the service name for a given path based on route patterns.\n *\n * When multiple patterns match the same path, the first matching pattern wins\n * based on object iteration order. To ensure predictable behavior, order your\n * route patterns from most specific to most general.\n *\n * @param path - The request path to match\n * @param routes - Route configuration mapping patterns to service names\n * @returns The service name for the matching route, or undefined if no match\n *\n * @example\n * ```ts\n * // Good: specific patterns first, general patterns last\n * routes: {\n * '/api/auth/admin/**': { service: 'admin-service' },\n * '/api/auth/**': { service: 'auth-service' },\n * '/api/**': { service: 'api-service' },\n * }\n * ```\n */\nexport function getServiceForPath(path: string, routes?: Record<string, RouteConfig>): string | undefined {\n if (!routes) return undefined\n\n for (const [pattern, config] of Object.entries(routes)) {\n if (matchesPattern(path, pattern)) {\n return config.service\n }\n }\n\n return undefined\n}\n"],"mappings":";;;;;;;AA4DA,SAAgB,kBAAkB,OAA4B;AAC5D,KAAI,MAAM,SAAS,aAAc,QAAO;AACxC,KAAK,MAAM,OAAiB,SAAS,aAAc,QAAO,MAAM;AAChE,QAAO;;;;;AAMT,SAAgB,mBAAmB,OAAwB;AACzD,QAAQ,MAA8B,UAChC,MAAkC,cACnC;;;;;;AAOP,SAAgB,4BAA4B,OAAc,KAAsC;CAC9F,MAAM,SAAS,mBAAmB,MAAM;CACxC,MAAM,EAAE,SAAS;CACjB,MAAM,gBAAiB,MAAqC,iBAAiB,MAAM;AACnF,QAAO;EACL;EACA;EACA,YAAY;EACZ,YAAY;EACZ;EACA,SAAS,MAAM;EACf,OAAO;EACP,GAAI,SAAS,UAAa,EAAE,MAAM;EACnC;;AAGH,SAAgB,UAAU,MAAc,SAAoB,SAA6B;AAEvF,KAAI,WAAW,QAAQ,SAAS,GAC9B;MAAI,QAAQ,MAAK,YAAW,eAAe,MAAM,QAAQ,CAAC,CACxD,QAAO;;AAKX,KAAI,CAAC,WAAW,QAAQ,WAAW,EACjC,QAAO;AAIT,QAAO,QAAQ,MAAK,YAAW,eAAe,MAAM,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;AAwB/D,SAAgB,kBAAkB,MAAc,QAA0D;AACxG,KAAI,CAAC,OAAQ,QAAO;AAEpB,MAAK,MAAM,CAAC,SAAS,WAAW,OAAO,QAAQ,OAAO,CACpD,KAAI,eAAe,MAAM,QAAQ,CAC/B,QAAO,OAAO"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { EnvironmentContext, RouteConfig, SamplingConfig } from "./types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/nitro.d.ts
|
|
4
|
+
interface NitroModuleOptions {
|
|
5
|
+
/**
|
|
6
|
+
* Enable or disable all logging globally.
|
|
7
|
+
* @default true
|
|
8
|
+
*/
|
|
9
|
+
enabled?: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Environment context overrides.
|
|
12
|
+
*/
|
|
13
|
+
env?: Partial<EnvironmentContext>;
|
|
14
|
+
/**
|
|
15
|
+
* Enable pretty printing.
|
|
16
|
+
* @default true in development, false in production
|
|
17
|
+
*/
|
|
18
|
+
pretty?: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Route patterns to include in logging.
|
|
21
|
+
* Supports glob patterns like '/api/**'.
|
|
22
|
+
* If not set, all routes are logged.
|
|
23
|
+
*/
|
|
24
|
+
include?: string[];
|
|
25
|
+
/**
|
|
26
|
+
* Route patterns to exclude from logging.
|
|
27
|
+
* Supports glob patterns like '/_nitro/**'.
|
|
28
|
+
* Exclusions take precedence over inclusions.
|
|
29
|
+
*/
|
|
30
|
+
exclude?: string[];
|
|
31
|
+
/**
|
|
32
|
+
* Route-specific service configuration.
|
|
33
|
+
*/
|
|
34
|
+
routes?: Record<string, RouteConfig>;
|
|
35
|
+
/**
|
|
36
|
+
* Sampling configuration for filtering logs.
|
|
37
|
+
*/
|
|
38
|
+
sampling?: SamplingConfig;
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
41
|
+
export { NitroModuleOptions as t };
|
|
42
|
+
//# sourceMappingURL=nitro-D81NBVPi.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nitro-D81NBVPi.d.mts","names":[],"sources":["../src/nitro.ts"],"mappings":";;;UAGiB,kBAAA;;AAAjB;;;EAKE,OAAA;EAKM;;;EAAN,GAAA,GAAM,OAAA,CAAQ,kBAAA;EA8BW;;;;EAxBzB,MAAA;EANc;;;;;EAad,OAAA;EAYwB;;;;;EALxB,OAAA;;;;EAKA,MAAA,GAAS,MAAA,SAAe,WAAA;;;;EAKxB,QAAA,GAAW,cAAA;AAAA"}
|