[{"data":1,"prerenderedAt":2496},["ShallowReactive",2],{"navigation_docs":3,"-extend-custom-framework":424,"-extend-custom-framework-surround":2491},[4,25,75,230,338,393],{"title":5,"path":6,"stem":7,"children":8,"page":24},"Start","\u002Fstart","1.start",[9,14,19],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fstart\u002Fintroduction","1.start\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fstart\u002Finstallation","1.start\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick Start","\u002Fstart\u002Fquick-start","1.start\u002F3.quick-start","i-lucide-zap",false,{"title":26,"path":27,"stem":28,"children":29,"page":24},"Learn","\u002Flearn","2.learn",[30,35,40,45,50,55,60,65,70],{"title":31,"path":32,"stem":33,"icon":34},"Overview","\u002Flearn\u002Foverview","2.learn\u002F0.overview","i-lucide-list",{"title":36,"path":37,"stem":38,"icon":39},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":41,"path":42,"stem":43,"icon":44},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":46,"path":47,"stem":48,"icon":49},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":51,"path":52,"stem":53,"icon":54},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F4.catalogs","i-lucide-book-open",{"title":56,"path":57,"stem":58,"icon":59},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F5.lifecycle","i-lucide-arrow-right-left",{"title":61,"path":62,"stem":63,"icon":64},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F6.sampling","i-lucide-filter",{"title":66,"path":67,"stem":68,"icon":69},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":71,"path":72,"stem":73,"icon":74},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F8.redaction","i-lucide-eye-off",{"title":76,"path":77,"stem":78,"children":79,"page":24},"Integrate","\u002Fintegrate","3.integrate",[80,84,147],{"title":31,"path":81,"stem":82,"icon":83},"\u002Fintegrate\u002Foverview","3.integrate\u002F0.overview","i-lucide-plug",{"title":85,"path":86,"stem":87,"children":88,"page":24},"Adapters","\u002Fintegrate\u002Fadapters","3.integrate\u002Fadapters",[89,92,132],{"title":31,"path":90,"stem":91,"icon":34},"\u002Fintegrate\u002Fadapters\u002Foverview","3.integrate\u002Fadapters\u002F01.overview",{"title":93,"path":94,"stem":95,"children":96,"page":24},"Cloud Destinations","\u002Fintegrate\u002Fadapters\u002Fcloud","3.integrate\u002Fadapters\u002Fcloud",[97,102,107,112,117,122,127],{"title":98,"path":99,"stem":100,"icon":101},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","3.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":103,"path":104,"stem":105,"icon":106},"OTLP","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fotlp","3.integrate\u002Fadapters\u002Fcloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":108,"path":109,"stem":110,"icon":111},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","3.integrate\u002Fadapters\u002Fcloud\u002F03.posthog","i-simple-icons-posthog",{"title":113,"path":114,"stem":115,"icon":116},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","3.integrate\u002Fadapters\u002Fcloud\u002F04.sentry","i-simple-icons-sentry",{"title":118,"path":119,"stem":120,"icon":121},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","3.integrate\u002Fadapters\u002Fcloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":123,"path":124,"stem":125,"icon":126},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","3.integrate\u002Fadapters\u002Fcloud\u002F06.datadog","i-simple-icons-datadog",{"title":128,"path":129,"stem":130,"icon":131},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fhyperdx","3.integrate\u002Fadapters\u002Fcloud\u002F07.hyperdx","i-custom-hyperdx",{"title":133,"path":134,"stem":135,"children":136,"page":24},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","3.integrate\u002Fadapters\u002Fself-hosted",[137,142],{"title":138,"path":139,"stem":140,"icon":141},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","3.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":143,"path":144,"stem":145,"icon":146},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","3.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":148,"path":149,"stem":150,"children":151,"page":24},"Frameworks","\u002Fintegrate\u002Fframeworks","3.integrate\u002Fframeworks",[152,156,161,166,171,176,181,186,191,196,201,206,211,216,220,225],{"title":31,"path":153,"stem":154,"icon":155},"\u002Fintegrate\u002Fframeworks\u002Foverview","3.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":157,"path":158,"stem":159,"icon":160},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","3.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":162,"path":163,"stem":164,"icon":165},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","3.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":167,"path":168,"stem":169,"icon":170},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","3.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":172,"path":173,"stem":174,"icon":175},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","3.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":177,"path":178,"stem":179,"icon":180},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","3.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":182,"path":183,"stem":184,"icon":185},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","3.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":187,"path":188,"stem":189,"icon":190},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","3.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":192,"path":193,"stem":194,"icon":195},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","3.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":197,"path":198,"stem":199,"icon":200},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","3.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":202,"path":203,"stem":204,"icon":205},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","3.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":207,"path":208,"stem":209,"icon":210},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","3.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":212,"path":213,"stem":214,"icon":215},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","3.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":217,"path":218,"stem":219,"icon":69},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","3.integrate\u002Fframeworks\u002F13.standalone",{"title":221,"path":222,"stem":223,"icon":224},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","3.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":226,"path":227,"stem":228,"icon":229},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","3.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":231,"path":232,"stem":233,"children":234,"page":24},"Use Cases","\u002Fuse-cases","4.use-cases",[235,239,244,273,301,333],{"title":31,"path":236,"stem":237,"icon":238},"\u002Fuse-cases\u002Foverview","4.use-cases\u002F0.overview","i-lucide-list-checks",{"title":240,"path":241,"stem":242,"icon":243},"Client Logging","\u002Fuse-cases\u002Fclient-logging","4.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":245,"icon":246,"path":247,"stem":248,"children":249,"page":24},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","4.use-cases\u002F2.ai-sdk",[250,253,258,263,268],{"title":31,"path":251,"stem":252,"icon":34},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","4.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":254,"path":255,"stem":256,"icon":257},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","4.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":259,"path":260,"stem":261,"icon":262},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","4.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":264,"path":265,"stem":266,"icon":267},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","4.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":269,"path":270,"stem":271,"icon":272},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","4.use-cases\u002F2.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":274,"icon":275,"path":276,"stem":277,"children":278,"page":24},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","4.use-cases\u002F3.better-auth",[279,282,287,292,296],{"title":31,"path":280,"stem":281,"icon":34},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","4.use-cases\u002F3.better-auth\u002F01.overview",{"title":283,"path":284,"stem":285,"icon":286},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","4.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":288,"path":289,"stem":290,"icon":291},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","4.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":293,"path":294,"stem":295,"icon":243},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","4.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":297,"path":298,"stem":299,"icon":300},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","4.use-cases\u002F3.better-auth\u002F05.performance","i-lucide-gauge",{"title":302,"icon":303,"path":304,"stem":305,"children":306,"page":24},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","4.use-cases\u002F4.audit",[307,310,315,320,325,329],{"title":31,"path":308,"stem":309,"icon":34},"\u002Fuse-cases\u002Faudit\u002Foverview","4.use-cases\u002F4.audit\u002F01.overview",{"title":311,"path":312,"stem":313,"icon":314},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","4.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":316,"path":317,"stem":318,"icon":319},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","4.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":321,"path":322,"stem":323,"icon":324},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","4.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":326,"path":327,"stem":328,"icon":303},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","4.use-cases\u002F4.audit\u002F05.compliance",{"title":330,"path":331,"stem":332,"icon":54},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","4.use-cases\u002F4.audit\u002F06.recipes",{"title":334,"path":335,"stem":336,"icon":337},"Enrichers","\u002Fuse-cases\u002Fenrichers","4.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":339,"path":340,"stem":341,"children":342,"page":24},"Extend","\u002Fextend","5.extend",[343,347,352,357,362,366,370,374,378,383,388],{"title":31,"path":344,"stem":345,"icon":346},"\u002Fextend\u002Foverview","5.extend\u002F0.overview","i-lucide-blocks",{"title":348,"path":349,"stem":350,"icon":351},"Stream","\u002Fextend\u002Fstream","5.extend\u002F1.stream","i-lucide-radio-tower",{"title":353,"path":354,"stem":355,"icon":356},"Custom framework","\u002Fextend\u002Fcustom-framework","5.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":358,"path":359,"stem":360,"icon":361},"FS reader","\u002Fextend\u002Ffs-reader","5.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":330,"path":363,"stem":364,"icon":365},"\u002Fextend\u002Fconsumer-recipes","5.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":367,"path":368,"stem":369,"icon":346},"Plugins","\u002Fextend\u002Fplugins","5.extend\u002F4.plugins",{"title":371,"path":372,"stem":373,"icon":337},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","5.extend\u002F5.custom-enrichers",{"title":375,"path":376,"stem":377,"icon":64},"Tail sampling","\u002Fextend\u002Ftail-sampling","5.extend\u002F6.tail-sampling",{"title":379,"path":380,"stem":381,"icon":382},"Identity headers","\u002Fextend\u002Fidentity-headers","5.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":384,"path":385,"stem":386,"icon":387},"Custom drains","\u002Fextend\u002Fcustom-drains","5.extend\u002F8.custom-drains","i-lucide-share-2",{"title":389,"path":390,"stem":391,"icon":392},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","5.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":394,"path":395,"stem":396,"children":397,"page":24},"Reference","\u002Freference","6.reference",[398,403,406,411,415,420],{"title":399,"path":400,"stem":401,"icon":402},"Configuration","\u002Freference\u002Fconfiguration","6.reference\u002F1.configuration","i-lucide-settings",{"title":297,"path":404,"stem":405,"icon":300},"\u002Freference\u002Fperformance","6.reference\u002F2.performance",{"title":407,"path":408,"stem":409,"icon":410},"Vite Plugin","\u002Freference\u002Fvite-plugin","6.reference\u002F3.vite-plugin","i-custom-vite",{"title":412,"path":413,"stem":414,"icon":303},"Best Practices","\u002Freference\u002Fbest-practices","6.reference\u002F4.best-practices",{"title":416,"path":417,"stem":418,"icon":419},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","6.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":421,"path":422,"stem":423,"icon":337},"Agent Skills","\u002Freference\u002Fagent-skills","6.reference\u002F6.agent-skills",{"id":425,"title":426,"body":427,"description":2481,"extension":2482,"links":2483,"meta":2487,"navigation":2488,"path":354,"seo":2489,"stem":355,"__hash__":2490},"docs\u002F5.extend\u002F10.custom-framework.md","Custom Framework Integration",{"type":428,"value":429,"toc":2469},"minimark",[430,443,451,461,544,691,696,767,771,948,971,975,984,1799,1805,1813,1816,1877,1880,1884,1896,2006,2020,2024,2031,2282,2285,2289,2292,2416,2427,2431,2465],[431,432,433,434,438,439,442],"p",{},"When the framework you use doesn't have an ",[435,436,437],"code",{},"evlog\u002F\u003Cframework>"," package yet, you build the integration yourself. ",[435,440,441],{},"evlog\u002Ftoolkit"," ships the same building blocks that power every built-in integration (Hono, Express, Fastify, Elysia, NestJS, SvelteKit) — you only write the framework-specific glue.",[431,444,445,446,450],{},"The mental model is always the same: ",[447,448,449],"strong",{},"request lifecycle → logger creation → enrich → drain",". The toolkit handles the request-context plumbing.",[452,453,456,457,460],"callout",{"color":454,"icon":455},"warning","i-lucide-flask-conical","The toolkit API is marked as ",[447,458,459],{},"beta",". The surface is stable (used by all built-in integrations) but may evolve based on community feedback.",[462,463,464,480],"table",{},[465,466,467],"thead",{},[468,469,470,474,477],"tr",{},[471,472,473],"th",{},"Surface",[471,475,476],{},"What it does",[471,478,479],{},"When to use",[481,482,483,505,528],"tbody",{},[468,484,485,495,498],{},[486,487,488],"td",{},[489,490,492],"a",{"href":491},"#manifest-mode-recommended",[435,493,494],{},"defineFrameworkIntegration()",[486,496,497],{},"Declaratively wire request extraction + logger attachment",[486,499,500,501,504],{},"HTTP frameworks with a ",[435,502,503],{},"(ctx, next)"," middleware shape (Hono, Express, Fastify, Elysia, NestJS-shaped)",[468,506,507,515,518],{},[486,508,509],{},[489,510,512],{"href":511},"#custom-mode",[435,513,514],{},"createMiddlewareLogger()",[486,516,517],{},"Imperative path: create the logger at request start, emit on response end",[486,519,520,521,523,524,527],{},"Frameworks whose lifecycle doesn't fit ",[435,522,503],{}," (NestJS interceptors, Next.js App Router, SvelteKit ",[435,525,526],{},"handle",")",[468,529,530,538,541],{},[486,531,532],{},[489,533,535],{"href":534},"#non-http-runtimes",[435,536,537],{},"createRequestLogger()",[486,539,540],{},"Wrap any unit of work in a logger lifecycle",[486,542,543],{},"Non-HTTP runtimes (queue workers, CLI, cron, durable workflows)",[545,546,549,552,683],"prompt",{":actions":547,"description":548,"icon":356},"[\"copy\",\"cursor\",\"windsurf\"]","Build an evlog integration for a custom framework",[431,550,551],{},"Wire evlog into an HTTP framework (or non-HTTP runtime) that doesn't have a built-in integration.",[553,554,555,584,598,608,622,637,648,674],"ul",{},[556,557,558,559,561,562,565,566,568,569,572,573,576,577,580,581],"li",{},"For HTTP frameworks with ",[435,560,503],{},", use ",[435,563,564],{},"defineFrameworkIntegration"," from ",[435,567,441],{}," — declare ",[435,570,571],{},"extractRequest(ctx)"," returning ",[435,574,575],{},"{ method, path, headers, requestId? }",", ",[435,578,579],{},"attachLogger(ctx, logger)",", and an optional storage from ",[435,582,583],{},"createLoggerStorage()",[556,585,586,587,590,591,594,595,597],{},"Headers may be either Web ",[435,588,589],{},"Headers"," or Node ",[435,592,593],{},"IncomingHttpHeaders"," — ",[435,596,564],{}," normalizes both",[556,599,600,601,604,605],{},"In your middleware, call ",[435,602,603],{},"integration.start(ctx, options)"," which returns ",[435,606,607],{},"{ skipped, finish, runWith, logger, middlewareOptions }",[556,609,610,611,614,615,618,619],{},"If ",[435,612,613],{},"skipped"," is ",[435,616,617],{},"true",", skip directly to ",[435,620,621],{},"next",[556,623,624,625,628,629,632,633,636],{},"Run downstream handlers inside ",[435,626,627],{},"runWith(() => next())"," so ",[435,630,631],{},"AsyncLocalStorage"," and ",[435,634,635],{},"log.fork()"," work",[556,638,639,640,643,644,647],{},"On success: ",[435,641,642],{},"await finish({ status })","; on error: ",[435,645,646],{},"await finish({ error })"," then re-throw",[556,649,650,651,576,654,576,657,576,660,576,663,576,666,669,670,673],{},"Expose ",[435,652,653],{},"drain",[435,655,656],{},"enrich",[435,658,659],{},"keep",[435,661,662],{},"include",[435,664,665],{},"exclude",[435,667,668],{},"routes",", and ",[435,671,672],{},"plugins"," options",[556,675,676,677,565,680,682],{},"For non-HTTP runtimes (queue workers, CLI, cron), use ",[435,678,679],{},"createRequestLogger",[435,681,441],{}," directly — wrap each unit of work in a logger lifecycle",[431,684,685,686],{},"Docs: ",[489,687,688],{"href":688,"rel":689},"https:\u002F\u002Fwww.evlog.dev\u002Fextend\u002Fcustom-framework",[690],"nofollow",[692,693,695],"h2",{"id":694},"install","Install",[697,698,699,724,738,752],"code-group",{},[700,701,707],"pre",{"className":702,"code":703,"filename":704,"language":705,"meta":706,"style":706},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm add evlog\n","pnpm","bash","",[435,708,709],{"__ignoreMap":706},[710,711,714,717,721],"span",{"class":712,"line":713},"line",1,[710,715,704],{"class":716},"sBMFI",[710,718,720],{"class":719},"sfazB"," add",[710,722,723],{"class":719}," evlog\n",[700,725,728],{"className":702,"code":726,"filename":727,"language":705,"meta":706,"style":706},"bun add evlog\n","bun",[435,729,730],{"__ignoreMap":706},[710,731,732,734,736],{"class":712,"line":713},[710,733,727],{"class":716},[710,735,720],{"class":719},[710,737,723],{"class":719},[700,739,742],{"className":702,"code":740,"filename":741,"language":705,"meta":706,"style":706},"yarn add evlog\n","yarn",[435,743,744],{"__ignoreMap":706},[710,745,746,748,750],{"class":712,"line":713},[710,747,741],{"class":716},[710,749,720],{"class":719},[710,751,723],{"class":719},[700,753,756],{"className":702,"code":754,"filename":755,"language":705,"meta":706,"style":706},"npm install evlog\n","npm",[435,757,758],{"__ignoreMap":706},[710,759,760,762,765],{"class":712,"line":713},[710,761,755],{"class":716},[710,763,764],{"class":719}," install",[710,766,723],{"class":719},[692,768,770],{"id":769},"whats-in-the-toolkit","What's in the toolkit",[462,772,773,783],{},[465,774,775],{},[468,776,777,780],{},[471,778,779],{},"Export",[471,781,782],{},"Purpose",[481,784,785,795,805,815,839,852,865,877,893,907,938],{},[468,786,787,792],{},[486,788,789],{},[435,790,791],{},"defineFrameworkIntegration(spec)",[486,793,794],{},"Manifest factory — extract request, create logger, attach, run with ALS",[468,796,797,802],{},[486,798,799],{},[435,800,801],{},"createMiddlewareLogger(opts)",[486,803,804],{},"Lower-level lifecycle (custom mode)",[468,806,807,812],{},[486,808,809],{},[435,810,811],{},"createRequestLogger(opts)",[486,813,814],{},"Wrap a non-HTTP unit of work in a logger lifecycle",[468,816,817,822],{},[486,818,819],{},[435,820,821],{},"BaseEvlogOptions",[486,823,824,825,576,827,576,829,576,831,576,833,576,835,576,837],{},"Base user-facing options — ",[435,826,653],{},[435,828,656],{},[435,830,659],{},[435,832,662],{},[435,834,665],{},[435,836,668],{},[435,838,672],{},[468,840,841,846],{},[486,842,843],{},[435,844,845],{},"MiddlewareLoggerResult",[486,847,848,849],{},"Return type: ",[435,850,851],{},"{ logger, finish, skipped }",[468,853,854,859],{},[486,855,856],{},[435,857,858],{},"extractSafeHeaders(headers)",[486,860,861,862,864],{},"Filter sensitive headers from a Web API ",[435,863,589],{}," object",[468,866,867,872],{},[486,868,869],{},[435,870,871],{},"extractSafeNodeHeaders(headers)",[486,873,874,875],{},"Filter sensitive headers from Node.js ",[435,876,593],{},[468,878,879,884],{},[486,880,881],{},[435,882,883],{},"createLoggerStorage(hint)",[486,885,886,887,890,891],{},"Factory returning ",[435,888,889],{},"{ storage, useLogger }"," backed by ",[435,892,631],{},[468,894,895,900],{},[486,896,897],{},[435,898,899],{},"defineEvlog(config)",[486,901,902,903,906],{},"Canonical config object — works for ",[435,904,905],{},"initLogger"," and middleware options",[468,908,909,914],{},[486,910,911],{},[435,912,913],{},"definePlugin(plugin)",[486,915,916,917,576,920,576,922,576,924,576,926,576,929,576,932,576,935],{},"Plugin contract — opt into any subset of ",[435,918,919],{},"setup",[435,921,656],{},[435,923,653],{},[435,925,659],{},[435,927,928],{},"onRequestStart",[435,930,931],{},"onRequestFinish",[435,933,934],{},"onClientLog",[435,936,937],{},"extendLogger",[468,939,940,945],{},[486,941,942],{},[435,943,944],{},"composeEnrichers \u002F composeDrains \u002F composeKeep \u002F composePlugins",[486,946,947],{},"Combine multiple extensions into one",[431,949,950,951,576,954,576,957,576,960,669,963,966,967,970],{},"Types like ",[435,952,953],{},"RequestLogger",[435,955,956],{},"DrainContext",[435,958,959],{},"EnrichContext",[435,961,962],{},"WideEvent",[435,964,965],{},"TailSamplingContext"," are exported from the main ",[435,968,969],{},"evlog"," package.",[692,972,974],{"id":973},"manifest-mode-recommended","Manifest mode (recommended)",[431,976,977,978,980,981,983],{},"Most frameworks fit a ",[435,979,503],{}," middleware shape. For those, write a manifest describing how to extract the request and attach the logger — ",[435,982,564],{}," does the rest.",[700,985,990],{"className":986,"code":987,"filename":988,"language":989,"meta":706,"style":706},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import type { IncomingMessage, ServerResponse } from 'node:http'\nimport {\n  createLoggerStorage,\n  defineFrameworkIntegration,\n  type BaseEvlogOptions,\n} from 'evlog\u002Ftoolkit'\nimport type { RequestLogger } from 'evlog'\n\nexport type MyFrameworkEvlogOptions = BaseEvlogOptions\n\nconst { storage, useLogger } = createLoggerStorage(\n  'middleware context. Make sure evlog middleware is registered before your routes.',\n)\n\nexport { useLogger }\n\nconst integration = defineFrameworkIntegration\u003CIncomingMessage>({\n  name: 'my-framework',\n  extractRequest: (req) => ({\n    method: req.method || 'GET',\n    path: req.url || '\u002F',\n    headers: req.headers,\n    requestId: typeof req.headers['x-request-id'] === 'string'\n      ? req.headers['x-request-id']\n      : undefined,\n  }),\n  attachLogger: (req, logger) => {\n    (req as IncomingMessage & { log: RequestLogger }).log = logger\n  },\n  storage,\n})\n\nexport function evlog(options: MyFrameworkEvlogOptions = {}) {\n  return async (req: IncomingMessage, res: ServerResponse, next: () => Promise\u003Cvoid>) => {\n    const { skipped, finish, runWith } = integration.start(req, options)\n    if (skipped) {\n      await next()\n      return\n    }\n    try {\n      await runWith(() => next())\n      await finish({ status: res.statusCode })\n    } catch (error) {\n      await finish({ error: error as Error })\n      throw error\n    }\n  }\n}\n","my-framework-evlog.ts","typescript",[435,991,992,1030,1038,1047,1055,1066,1080,1102,1109,1127,1132,1159,1173,1179,1184,1197,1202,1231,1250,1274,1303,1329,1346,1384,1405,1414,1424,1447,1486,1492,1500,1507,1512,1539,1592,1635,1650,1661,1667,1673,1681,1700,1728,1746,1773,1782,1787,1793],{"__ignoreMap":706},[710,993,994,998,1001,1005,1009,1012,1015,1018,1021,1024,1027],{"class":712,"line":713},[710,995,997],{"class":996},"s7zQu","import",[710,999,1000],{"class":996}," type",[710,1002,1004],{"class":1003},"sMK4o"," {",[710,1006,1008],{"class":1007},"sTEyZ"," IncomingMessage",[710,1010,1011],{"class":1003},",",[710,1013,1014],{"class":1007}," ServerResponse",[710,1016,1017],{"class":1003}," }",[710,1019,1020],{"class":996}," from",[710,1022,1023],{"class":1003}," '",[710,1025,1026],{"class":719},"node:http",[710,1028,1029],{"class":1003},"'\n",[710,1031,1033,1035],{"class":712,"line":1032},2,[710,1034,997],{"class":996},[710,1036,1037],{"class":1003}," {\n",[710,1039,1041,1044],{"class":712,"line":1040},3,[710,1042,1043],{"class":1007},"  createLoggerStorage",[710,1045,1046],{"class":1003},",\n",[710,1048,1050,1053],{"class":712,"line":1049},4,[710,1051,1052],{"class":1007},"  defineFrameworkIntegration",[710,1054,1046],{"class":1003},[710,1056,1058,1061,1064],{"class":712,"line":1057},5,[710,1059,1060],{"class":996},"  type",[710,1062,1063],{"class":1007}," BaseEvlogOptions",[710,1065,1046],{"class":1003},[710,1067,1069,1072,1074,1076,1078],{"class":712,"line":1068},6,[710,1070,1071],{"class":1003},"}",[710,1073,1020],{"class":996},[710,1075,1023],{"class":1003},[710,1077,441],{"class":719},[710,1079,1029],{"class":1003},[710,1081,1083,1085,1087,1089,1092,1094,1096,1098,1100],{"class":712,"line":1082},7,[710,1084,997],{"class":996},[710,1086,1000],{"class":996},[710,1088,1004],{"class":1003},[710,1090,1091],{"class":1007}," RequestLogger",[710,1093,1017],{"class":1003},[710,1095,1020],{"class":996},[710,1097,1023],{"class":1003},[710,1099,969],{"class":719},[710,1101,1029],{"class":1003},[710,1103,1105],{"class":712,"line":1104},8,[710,1106,1108],{"emptyLinePlaceholder":1107},true,"\n",[710,1110,1112,1115,1118,1121,1124],{"class":712,"line":1111},9,[710,1113,1114],{"class":996},"export",[710,1116,1000],{"class":1117},"spNyl",[710,1119,1120],{"class":716}," MyFrameworkEvlogOptions",[710,1122,1123],{"class":1003}," =",[710,1125,1126],{"class":716}," BaseEvlogOptions\n",[710,1128,1130],{"class":712,"line":1129},10,[710,1131,1108],{"emptyLinePlaceholder":1107},[710,1133,1135,1138,1140,1143,1145,1148,1150,1152,1156],{"class":712,"line":1134},11,[710,1136,1137],{"class":1117},"const",[710,1139,1004],{"class":1003},[710,1141,1142],{"class":1007}," storage",[710,1144,1011],{"class":1003},[710,1146,1147],{"class":1007}," useLogger ",[710,1149,1071],{"class":1003},[710,1151,1123],{"class":1003},[710,1153,1155],{"class":1154},"s2Zo4"," createLoggerStorage",[710,1157,1158],{"class":1007},"(\n",[710,1160,1162,1165,1168,1171],{"class":712,"line":1161},12,[710,1163,1164],{"class":1003},"  '",[710,1166,1167],{"class":719},"middleware context. Make sure evlog middleware is registered before your routes.",[710,1169,1170],{"class":1003},"'",[710,1172,1046],{"class":1003},[710,1174,1176],{"class":712,"line":1175},13,[710,1177,1178],{"class":1007},")\n",[710,1180,1182],{"class":712,"line":1181},14,[710,1183,1108],{"emptyLinePlaceholder":1107},[710,1185,1187,1189,1191,1194],{"class":712,"line":1186},15,[710,1188,1114],{"class":996},[710,1190,1004],{"class":1003},[710,1192,1193],{"class":1007}," useLogger",[710,1195,1196],{"class":1003}," }\n",[710,1198,1200],{"class":712,"line":1199},16,[710,1201,1108],{"emptyLinePlaceholder":1107},[710,1203,1205,1207,1210,1213,1216,1219,1222,1225,1228],{"class":712,"line":1204},17,[710,1206,1137],{"class":1117},[710,1208,1209],{"class":1007}," integration ",[710,1211,1212],{"class":1003},"=",[710,1214,1215],{"class":1154}," defineFrameworkIntegration",[710,1217,1218],{"class":1003},"\u003C",[710,1220,1221],{"class":716},"IncomingMessage",[710,1223,1224],{"class":1003},">",[710,1226,1227],{"class":1007},"(",[710,1229,1230],{"class":1003},"{\n",[710,1232,1234,1238,1241,1243,1246,1248],{"class":712,"line":1233},18,[710,1235,1237],{"class":1236},"swJcz","  name",[710,1239,1240],{"class":1003},":",[710,1242,1023],{"class":1003},[710,1244,1245],{"class":719},"my-framework",[710,1247,1170],{"class":1003},[710,1249,1046],{"class":1003},[710,1251,1253,1256,1258,1261,1265,1267,1270,1272],{"class":712,"line":1252},19,[710,1254,1255],{"class":1154},"  extractRequest",[710,1257,1240],{"class":1003},[710,1259,1260],{"class":1003}," (",[710,1262,1264],{"class":1263},"sHdIc","req",[710,1266,527],{"class":1003},[710,1268,1269],{"class":1117}," =>",[710,1271,1260],{"class":1007},[710,1273,1230],{"class":1003},[710,1275,1277,1280,1282,1285,1288,1291,1294,1296,1299,1301],{"class":712,"line":1276},20,[710,1278,1279],{"class":1236},"    method",[710,1281,1240],{"class":1003},[710,1283,1284],{"class":1007}," req",[710,1286,1287],{"class":1003},".",[710,1289,1290],{"class":1007},"method ",[710,1292,1293],{"class":1003},"||",[710,1295,1023],{"class":1003},[710,1297,1298],{"class":719},"GET",[710,1300,1170],{"class":1003},[710,1302,1046],{"class":1003},[710,1304,1306,1309,1311,1313,1315,1318,1320,1322,1325,1327],{"class":712,"line":1305},21,[710,1307,1308],{"class":1236},"    path",[710,1310,1240],{"class":1003},[710,1312,1284],{"class":1007},[710,1314,1287],{"class":1003},[710,1316,1317],{"class":1007},"url ",[710,1319,1293],{"class":1003},[710,1321,1023],{"class":1003},[710,1323,1324],{"class":719},"\u002F",[710,1326,1170],{"class":1003},[710,1328,1046],{"class":1003},[710,1330,1332,1335,1337,1339,1341,1344],{"class":712,"line":1331},22,[710,1333,1334],{"class":1236},"    headers",[710,1336,1240],{"class":1003},[710,1338,1284],{"class":1007},[710,1340,1287],{"class":1003},[710,1342,1343],{"class":1007},"headers",[710,1345,1046],{"class":1003},[710,1347,1349,1352,1354,1357,1359,1361,1364,1366,1369,1371,1374,1377,1379,1382],{"class":712,"line":1348},23,[710,1350,1351],{"class":1236},"    requestId",[710,1353,1240],{"class":1003},[710,1355,1356],{"class":1003}," typeof",[710,1358,1284],{"class":1007},[710,1360,1287],{"class":1003},[710,1362,1363],{"class":1007},"headers[",[710,1365,1170],{"class":1003},[710,1367,1368],{"class":719},"x-request-id",[710,1370,1170],{"class":1003},[710,1372,1373],{"class":1007},"] ",[710,1375,1376],{"class":1003},"===",[710,1378,1023],{"class":1003},[710,1380,1381],{"class":719},"string",[710,1383,1029],{"class":1003},[710,1385,1387,1390,1392,1394,1396,1398,1400,1402],{"class":712,"line":1386},24,[710,1388,1389],{"class":1003},"      ?",[710,1391,1284],{"class":1007},[710,1393,1287],{"class":1003},[710,1395,1363],{"class":1007},[710,1397,1170],{"class":1003},[710,1399,1368],{"class":719},[710,1401,1170],{"class":1003},[710,1403,1404],{"class":1007},"]\n",[710,1406,1408,1411],{"class":712,"line":1407},25,[710,1409,1410],{"class":1003},"      :",[710,1412,1413],{"class":1003}," undefined,\n",[710,1415,1417,1420,1422],{"class":712,"line":1416},26,[710,1418,1419],{"class":1003},"  }",[710,1421,527],{"class":1007},[710,1423,1046],{"class":1003},[710,1425,1427,1430,1432,1434,1436,1438,1441,1443,1445],{"class":712,"line":1426},27,[710,1428,1429],{"class":1154},"  attachLogger",[710,1431,1240],{"class":1003},[710,1433,1260],{"class":1003},[710,1435,1264],{"class":1263},[710,1437,1011],{"class":1003},[710,1439,1440],{"class":1263}," logger",[710,1442,527],{"class":1003},[710,1444,1269],{"class":1117},[710,1446,1037],{"class":1003},[710,1448,1450,1453,1455,1458,1460,1463,1465,1468,1470,1472,1474,1476,1478,1481,1483],{"class":712,"line":1449},28,[710,1451,1452],{"class":1236},"    (",[710,1454,1264],{"class":1007},[710,1456,1457],{"class":996}," as",[710,1459,1008],{"class":716},[710,1461,1462],{"class":1003}," &",[710,1464,1004],{"class":1003},[710,1466,1467],{"class":1236}," log",[710,1469,1240],{"class":1003},[710,1471,1091],{"class":716},[710,1473,1017],{"class":1003},[710,1475,527],{"class":1236},[710,1477,1287],{"class":1003},[710,1479,1480],{"class":1007},"log",[710,1482,1123],{"class":1003},[710,1484,1485],{"class":1007}," logger\n",[710,1487,1489],{"class":712,"line":1488},29,[710,1490,1491],{"class":1003},"  },\n",[710,1493,1495,1498],{"class":712,"line":1494},30,[710,1496,1497],{"class":1007},"  storage",[710,1499,1046],{"class":1003},[710,1501,1503,1505],{"class":712,"line":1502},31,[710,1504,1071],{"class":1003},[710,1506,1178],{"class":1007},[710,1508,1510],{"class":712,"line":1509},32,[710,1511,1108],{"emptyLinePlaceholder":1107},[710,1513,1515,1517,1520,1523,1525,1528,1530,1532,1534,1537],{"class":712,"line":1514},33,[710,1516,1114],{"class":996},[710,1518,1519],{"class":1117}," function",[710,1521,1522],{"class":1154}," evlog",[710,1524,1227],{"class":1003},[710,1526,1527],{"class":1263},"options",[710,1529,1240],{"class":1003},[710,1531,1120],{"class":716},[710,1533,1123],{"class":1003},[710,1535,1536],{"class":1003}," {})",[710,1538,1037],{"class":1003},[710,1540,1542,1545,1548,1550,1552,1554,1556,1558,1561,1563,1565,1567,1570,1572,1575,1577,1580,1582,1585,1588,1590],{"class":712,"line":1541},34,[710,1543,1544],{"class":996},"  return",[710,1546,1547],{"class":1117}," async",[710,1549,1260],{"class":1003},[710,1551,1264],{"class":1263},[710,1553,1240],{"class":1003},[710,1555,1008],{"class":716},[710,1557,1011],{"class":1003},[710,1559,1560],{"class":1263}," res",[710,1562,1240],{"class":1003},[710,1564,1014],{"class":716},[710,1566,1011],{"class":1003},[710,1568,1569],{"class":1154}," next",[710,1571,1240],{"class":1003},[710,1573,1574],{"class":1003}," ()",[710,1576,1269],{"class":1117},[710,1578,1579],{"class":716}," Promise",[710,1581,1218],{"class":1003},[710,1583,1584],{"class":716},"void",[710,1586,1587],{"class":1003},">)",[710,1589,1269],{"class":1117},[710,1591,1037],{"class":1003},[710,1593,1595,1598,1600,1603,1605,1608,1610,1613,1615,1617,1620,1622,1625,1627,1629,1631,1633],{"class":712,"line":1594},35,[710,1596,1597],{"class":1117},"    const",[710,1599,1004],{"class":1003},[710,1601,1602],{"class":1007}," skipped",[710,1604,1011],{"class":1003},[710,1606,1607],{"class":1007}," finish",[710,1609,1011],{"class":1003},[710,1611,1612],{"class":1007}," runWith",[710,1614,1017],{"class":1003},[710,1616,1123],{"class":1003},[710,1618,1619],{"class":1007}," integration",[710,1621,1287],{"class":1003},[710,1623,1624],{"class":1154},"start",[710,1626,1227],{"class":1236},[710,1628,1264],{"class":1007},[710,1630,1011],{"class":1003},[710,1632,673],{"class":1007},[710,1634,1178],{"class":1236},[710,1636,1638,1641,1643,1645,1648],{"class":712,"line":1637},36,[710,1639,1640],{"class":996},"    if",[710,1642,1260],{"class":1236},[710,1644,613],{"class":1007},[710,1646,1647],{"class":1236},") ",[710,1649,1230],{"class":1003},[710,1651,1653,1656,1658],{"class":712,"line":1652},37,[710,1654,1655],{"class":996},"      await",[710,1657,1569],{"class":1154},[710,1659,1660],{"class":1236},"()\n",[710,1662,1664],{"class":712,"line":1663},38,[710,1665,1666],{"class":996},"      return\n",[710,1668,1670],{"class":712,"line":1669},39,[710,1671,1672],{"class":1003},"    }\n",[710,1674,1676,1679],{"class":712,"line":1675},40,[710,1677,1678],{"class":996},"    try",[710,1680,1037],{"class":1003},[710,1682,1684,1686,1688,1690,1693,1695,1697],{"class":712,"line":1683},41,[710,1685,1655],{"class":996},[710,1687,1612],{"class":1154},[710,1689,1227],{"class":1236},[710,1691,1692],{"class":1003},"()",[710,1694,1269],{"class":1117},[710,1696,1569],{"class":1154},[710,1698,1699],{"class":1236},"())\n",[710,1701,1703,1705,1707,1709,1712,1715,1717,1719,1721,1724,1726],{"class":712,"line":1702},42,[710,1704,1655],{"class":996},[710,1706,1607],{"class":1154},[710,1708,1227],{"class":1236},[710,1710,1711],{"class":1003},"{",[710,1713,1714],{"class":1236}," status",[710,1716,1240],{"class":1003},[710,1718,1560],{"class":1007},[710,1720,1287],{"class":1003},[710,1722,1723],{"class":1007},"statusCode",[710,1725,1017],{"class":1003},[710,1727,1178],{"class":1236},[710,1729,1731,1734,1737,1739,1742,1744],{"class":712,"line":1730},43,[710,1732,1733],{"class":1003},"    }",[710,1735,1736],{"class":996}," catch",[710,1738,1260],{"class":1236},[710,1740,1741],{"class":1007},"error",[710,1743,1647],{"class":1236},[710,1745,1230],{"class":1003},[710,1747,1749,1751,1753,1755,1757,1760,1762,1764,1766,1769,1771],{"class":712,"line":1748},44,[710,1750,1655],{"class":996},[710,1752,1607],{"class":1154},[710,1754,1227],{"class":1236},[710,1756,1711],{"class":1003},[710,1758,1759],{"class":1236}," error",[710,1761,1240],{"class":1003},[710,1763,1759],{"class":1007},[710,1765,1457],{"class":996},[710,1767,1768],{"class":716}," Error",[710,1770,1017],{"class":1003},[710,1772,1178],{"class":1236},[710,1774,1776,1779],{"class":712,"line":1775},45,[710,1777,1778],{"class":996},"      throw",[710,1780,1781],{"class":1007}," error\n",[710,1783,1785],{"class":712,"line":1784},46,[710,1786,1672],{"class":1003},[710,1788,1790],{"class":712,"line":1789},47,[710,1791,1792],{"class":1003},"  }\n",[710,1794,1796],{"class":712,"line":1795},48,[710,1797,1798],{"class":1003},"}\n",[431,1800,1801,1802,1804],{},"That's it. This middleware gets every feature for free: route filtering, drain adapters, enrichers, tail sampling, error capture, plugin lifecycle hooks, ",[435,1803,635],{},", and duration tracking.",[1806,1807,1809,1810,1812],"h3",{"id":1808},"what-defineframeworkintegration-does","What ",[435,1811,564],{}," does",[431,1814,1815],{},"Given the manifest above, the helper:",[1817,1818,1819,1828,1839,1846,1850,1860],"ol",{},[556,1820,1821,1822,1824,1825,1827],{},"Normalizes headers (auto-detects ",[435,1823,589],{}," vs ",[435,1826,593],{},").",[556,1829,1830,1831,1834,1835,1838],{},"Generates a ",[435,1832,1833],{},"requestId"," if ",[435,1836,1837],{},"extractRequest"," doesn't return one.",[556,1840,1841,1842,1845],{},"Calls ",[435,1843,1844],{},"createMiddlewareLogger"," with the merged options.",[556,1847,1841,1848,1287],{},[435,1849,579],{},[556,1851,1852,1853,1855,1856,1859],{},"Attaches ",[435,1854,635],{}," to the logger when ",[435,1857,1858],{},"storage"," is provided (so users can spawn correlated background work).",[556,1861,1862,1863,1866,1867,1870,1871,1874,1875,1287],{},"Exposes ",[435,1864,1865],{},"runWith(fn)"," — runs ",[435,1868,1869],{},"fn()"," inside ",[435,1872,1873],{},"storage.run(logger, …)"," if storage is configured, otherwise just calls ",[435,1876,1869],{},[431,1878,1879],{},"You're left with only the framework-specific glue: where to read the request from, where to attach the logger, and how to compute the response status.",[692,1881,1883],{"id":1882},"custom-mode","Custom mode",[431,1885,1886,1887,1889,1890,1892,1893,1895],{},"If your framework's lifecycle doesn't fit a clean ",[435,1888,503],{}," shape (NestJS interceptors, Next.js App Router, SvelteKit ",[435,1891,526],{},"), drop one level lower and call ",[435,1894,1844],{}," directly:",[700,1897,1899],{"className":986,"code":1898,"language":989,"meta":706,"style":706},"import { createMiddlewareLogger, extractSafeNodeHeaders } from 'evlog\u002Ftoolkit'\n\nconst { logger, finish, skipped } = createMiddlewareLogger({\n  method,\n  path,\n  requestId,\n  headers: extractSafeNodeHeaders(rawHeaders),\n  ...options,\n})\n",[435,1900,1901,1925,1929,1956,1963,1970,1977,1991,2000],{"__ignoreMap":706},[710,1902,1903,1905,1907,1910,1912,1915,1917,1919,1921,1923],{"class":712,"line":713},[710,1904,997],{"class":996},[710,1906,1004],{"class":1003},[710,1908,1909],{"class":1007}," createMiddlewareLogger",[710,1911,1011],{"class":1003},[710,1913,1914],{"class":1007}," extractSafeNodeHeaders",[710,1916,1017],{"class":1003},[710,1918,1020],{"class":996},[710,1920,1023],{"class":1003},[710,1922,441],{"class":719},[710,1924,1029],{"class":1003},[710,1926,1927],{"class":712,"line":1032},[710,1928,1108],{"emptyLinePlaceholder":1107},[710,1930,1931,1933,1935,1937,1939,1941,1943,1946,1948,1950,1952,1954],{"class":712,"line":1040},[710,1932,1137],{"class":1117},[710,1934,1004],{"class":1003},[710,1936,1440],{"class":1007},[710,1938,1011],{"class":1003},[710,1940,1607],{"class":1007},[710,1942,1011],{"class":1003},[710,1944,1945],{"class":1007}," skipped ",[710,1947,1071],{"class":1003},[710,1949,1123],{"class":1003},[710,1951,1909],{"class":1154},[710,1953,1227],{"class":1007},[710,1955,1230],{"class":1003},[710,1957,1958,1961],{"class":712,"line":1049},[710,1959,1960],{"class":1007},"  method",[710,1962,1046],{"class":1003},[710,1964,1965,1968],{"class":712,"line":1057},[710,1966,1967],{"class":1007},"  path",[710,1969,1046],{"class":1003},[710,1971,1972,1975],{"class":712,"line":1068},[710,1973,1974],{"class":1007},"  requestId",[710,1976,1046],{"class":1003},[710,1978,1979,1982,1984,1986,1989],{"class":712,"line":1082},[710,1980,1981],{"class":1236},"  headers",[710,1983,1240],{"class":1003},[710,1985,1914],{"class":1154},[710,1987,1988],{"class":1007},"(rawHeaders)",[710,1990,1046],{"class":1003},[710,1992,1993,1996,1998],{"class":712,"line":1104},[710,1994,1995],{"class":1003},"  ...",[710,1997,1527],{"class":1007},[710,1999,1046],{"class":1003},[710,2001,2002,2004],{"class":712,"line":1111},[710,2003,1071],{"class":1003},[710,2005,1178],{"class":1007},[431,2007,2008,2009,2012,2013,2015,2016,2019],{},"You'll be responsible for ALS wrapping (",[435,2010,2011],{},"storage.run","), ",[435,2014,635],{}," attachment (via ",[435,2017,2018],{},"attachForkToLogger","), and finishing the lifecycle — but you keep the full pipeline (route filtering, sampling, emit, enrich, drain, plugins) for free.",[692,2021,2023],{"id":2022},"non-http-runtimes","Non-HTTP runtimes",[431,2025,2026,2027,565,2029,1895],{},"For queue workers, CLI drivers, cron jobs, or durable execution engines, skip the HTTP-shaped helpers and use ",[435,2028,679],{},[435,2030,441],{},[700,2032,2036],{"className":2033,"code":2034,"language":2035,"meta":706,"style":706},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createRequestLogger } from 'evlog\u002Ftoolkit'\n\nasync function processJob(job: Job) {\n  const logger = createRequestLogger({\n    service: 'jobs',\n    context: { jobId: job.id, queue: job.queue },\n  })\n\n  try {\n    await runJob(job)\n    logger.set({ status: 'success' })\n  } catch (err) {\n    logger.error(err)\n    throw err\n  } finally {\n    await logger.emit()\n  }\n}\n","ts",[435,2037,2038,2057,2061,2085,2100,2116,2155,2161,2165,2172,2186,2215,2230,2244,2252,2261,2274,2278],{"__ignoreMap":706},[710,2039,2040,2042,2044,2047,2049,2051,2053,2055],{"class":712,"line":713},[710,2041,997],{"class":996},[710,2043,1004],{"class":1003},[710,2045,2046],{"class":1007}," createRequestLogger",[710,2048,1017],{"class":1003},[710,2050,1020],{"class":996},[710,2052,1023],{"class":1003},[710,2054,441],{"class":719},[710,2056,1029],{"class":1003},[710,2058,2059],{"class":712,"line":1032},[710,2060,1108],{"emptyLinePlaceholder":1107},[710,2062,2063,2066,2068,2071,2073,2076,2078,2081,2083],{"class":712,"line":1040},[710,2064,2065],{"class":1117},"async",[710,2067,1519],{"class":1117},[710,2069,2070],{"class":1154}," processJob",[710,2072,1227],{"class":1003},[710,2074,2075],{"class":1263},"job",[710,2077,1240],{"class":1003},[710,2079,2080],{"class":716}," Job",[710,2082,527],{"class":1003},[710,2084,1037],{"class":1003},[710,2086,2087,2090,2092,2094,2096,2098],{"class":712,"line":1049},[710,2088,2089],{"class":1117},"  const",[710,2091,1440],{"class":1007},[710,2093,1123],{"class":1003},[710,2095,2046],{"class":1154},[710,2097,1227],{"class":1236},[710,2099,1230],{"class":1003},[710,2101,2102,2105,2107,2109,2112,2114],{"class":712,"line":1057},[710,2103,2104],{"class":1236},"    service",[710,2106,1240],{"class":1003},[710,2108,1023],{"class":1003},[710,2110,2111],{"class":719},"jobs",[710,2113,1170],{"class":1003},[710,2115,1046],{"class":1003},[710,2117,2118,2121,2123,2125,2128,2130,2133,2135,2138,2140,2143,2145,2147,2149,2152],{"class":712,"line":1068},[710,2119,2120],{"class":1236},"    context",[710,2122,1240],{"class":1003},[710,2124,1004],{"class":1003},[710,2126,2127],{"class":1236}," jobId",[710,2129,1240],{"class":1003},[710,2131,2132],{"class":1007}," job",[710,2134,1287],{"class":1003},[710,2136,2137],{"class":1007},"id",[710,2139,1011],{"class":1003},[710,2141,2142],{"class":1236}," queue",[710,2144,1240],{"class":1003},[710,2146,2132],{"class":1007},[710,2148,1287],{"class":1003},[710,2150,2151],{"class":1007},"queue",[710,2153,2154],{"class":1003}," },\n",[710,2156,2157,2159],{"class":712,"line":1082},[710,2158,1419],{"class":1003},[710,2160,1178],{"class":1236},[710,2162,2163],{"class":712,"line":1104},[710,2164,1108],{"emptyLinePlaceholder":1107},[710,2166,2167,2170],{"class":712,"line":1111},[710,2168,2169],{"class":996},"  try",[710,2171,1037],{"class":1003},[710,2173,2174,2177,2180,2182,2184],{"class":712,"line":1129},[710,2175,2176],{"class":996},"    await",[710,2178,2179],{"class":1154}," runJob",[710,2181,1227],{"class":1236},[710,2183,2075],{"class":1007},[710,2185,1178],{"class":1236},[710,2187,2188,2191,2193,2196,2198,2200,2202,2204,2206,2209,2211,2213],{"class":712,"line":1134},[710,2189,2190],{"class":1007},"    logger",[710,2192,1287],{"class":1003},[710,2194,2195],{"class":1154},"set",[710,2197,1227],{"class":1236},[710,2199,1711],{"class":1003},[710,2201,1714],{"class":1236},[710,2203,1240],{"class":1003},[710,2205,1023],{"class":1003},[710,2207,2208],{"class":719},"success",[710,2210,1170],{"class":1003},[710,2212,1017],{"class":1003},[710,2214,1178],{"class":1236},[710,2216,2217,2219,2221,2223,2226,2228],{"class":712,"line":1161},[710,2218,1419],{"class":1003},[710,2220,1736],{"class":996},[710,2222,1260],{"class":1236},[710,2224,2225],{"class":1007},"err",[710,2227,1647],{"class":1236},[710,2229,1230],{"class":1003},[710,2231,2232,2234,2236,2238,2240,2242],{"class":712,"line":1175},[710,2233,2190],{"class":1007},[710,2235,1287],{"class":1003},[710,2237,1741],{"class":1154},[710,2239,1227],{"class":1236},[710,2241,2225],{"class":1007},[710,2243,1178],{"class":1236},[710,2245,2246,2249],{"class":712,"line":1181},[710,2247,2248],{"class":996},"    throw",[710,2250,2251],{"class":1007}," err\n",[710,2253,2254,2256,2259],{"class":712,"line":1186},[710,2255,1419],{"class":1003},[710,2257,2258],{"class":996}," finally",[710,2260,1037],{"class":1003},[710,2262,2263,2265,2267,2269,2272],{"class":712,"line":1199},[710,2264,2176],{"class":996},[710,2266,1440],{"class":1007},[710,2268,1287],{"class":1003},[710,2270,2271],{"class":1154},"emit",[710,2273,1660],{"class":1236},[710,2275,2276],{"class":712,"line":1204},[710,2277,1792],{"class":1003},[710,2279,2280],{"class":712,"line":1233},[710,2281,1798],{"class":1003},[431,2283,2284],{},"Same enrichers, same drain hook, same identity headers — only the entry point shape changes.",[692,2286,2288],{"id":2287},"reference-implementations","Reference implementations",[431,2290,2291],{},"Study these built-in integrations for framework-specific patterns:",[462,2293,2294,2310],{},[465,2295,2296],{},[468,2297,2298,2301,2304,2307],{},[471,2299,2300],{},"Framework",[471,2302,2303],{},"Lines",[471,2305,2306],{},"Mode",[471,2308,2309],{},"Source",[481,2311,2312,2329,2345,2362,2379,2396],{},[468,2313,2314,2316,2319,2322],{},[486,2315,192],{},[486,2317,2318],{},"~50",[486,2320,2321],{},"manifest",[486,2323,2324],{},[489,2325,2328],{"href":2326,"rel":2327},"https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog\u002Fblob\u002Fmain\u002Fpackages\u002Fevlog\u002Fsrc\u002Fhono\u002Findex.ts",[690],"hono\u002Findex.ts",[468,2330,2331,2333,2335,2338],{},[486,2332,187],{},[486,2334,2318],{},[486,2336,2337],{},"manifest + ALS",[486,2339,2340],{},[489,2341,2344],{"href":2342,"rel":2343},"https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog\u002Fblob\u002Fmain\u002Fpackages\u002Fevlog\u002Fsrc\u002Fexpress\u002Findex.ts",[690],"express\u002Findex.ts",[468,2346,2347,2349,2352,2355],{},[486,2348,197],{},[486,2350,2351],{},"~70",[486,2353,2354],{},"manifest + Fastify hooks",[486,2356,2357],{},[489,2358,2361],{"href":2359,"rel":2360},"https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog\u002Fblob\u002Fmain\u002Fpackages\u002Fevlog\u002Fsrc\u002Ffastify\u002Findex.ts",[690],"fastify\u002Findex.ts",[468,2363,2364,2366,2369,2372],{},[486,2365,202],{},[486,2367,2368],{},"~80",[486,2370,2371],{},"manifest + custom ALS scoping",[486,2373,2374],{},[489,2375,2378],{"href":2376,"rel":2377},"https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog\u002Fblob\u002Fmain\u002Fpackages\u002Fevlog\u002Fsrc\u002Felysia\u002Findex.ts",[690],"elysia\u002Findex.ts",[468,2380,2381,2383,2386,2389],{},[486,2382,182],{},[486,2384,2385],{},"~120",[486,2387,2388],{},"custom (interceptor)",[486,2390,2391],{},[489,2392,2395],{"href":2393,"rel":2394},"https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog\u002Fblob\u002Fmain\u002Fpackages\u002Fevlog\u002Fsrc\u002Fnestjs\u002F",[690],"nestjs\u002F",[468,2397,2398,2400,2403,2409],{},[486,2399,167],{},[486,2401,2402],{},"~90",[486,2404,2405,2406,2408],{},"custom (",[435,2407,526],{}," hook)",[486,2410,2411],{},[489,2412,2415],{"href":2413,"rel":2414},"https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog\u002Fblob\u002Fmain\u002Fpackages\u002Fevlog\u002Fsrc\u002Fsveltekit\u002F",[690],"sveltekit\u002F",[452,2417,2420,2421,2426],{"color":2418,"icon":2419},"neutral","i-lucide-heart","Built an integration for a framework we don't support? ",[489,2422,2425],{"href":2423,"rel":2424},"https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog\u002Fpulls",[690],"Open a PR"," — the community will thank you.",[692,2428,2430],{"id":2429},"next-steps","Next steps",[553,2432,2433,2439,2445,2450,2455,2460],{},[556,2434,2435,2438],{},[489,2436,2437],{"href":385},"Custom Drains"," — same toolkit shape for drain destinations",[556,2440,2441,2444],{},[489,2442,2443],{"href":372},"Custom Enrichers"," — same toolkit shape for derived event fields",[556,2446,2447,2449],{},[489,2448,367],{"href":368}," — multi-hook extensions (drain + enrich + keep in one object)",[556,2451,2452,2454],{},[489,2453,41],{"href":42}," — design comprehensive events with context layering",[556,2456,2457,2459],{},[489,2458,61],{"href":62}," — control log volume with head and tail sampling",[556,2461,2462,2464],{},[489,2463,85],{"href":90}," — send logs to Axiom, Sentry, PostHog, and more",[2466,2467,2468],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":706,"searchDepth":1032,"depth":1032,"links":2470},[2471,2472,2473,2477,2478,2479,2480],{"id":694,"depth":1032,"text":695},{"id":769,"depth":1032,"text":770},{"id":973,"depth":1032,"text":974,"children":2474},[2475],{"id":1808,"depth":1040,"text":2476},"What defineFrameworkIntegration does",{"id":1882,"depth":1032,"text":1883},{"id":2022,"depth":1032,"text":2023},{"id":2287,"depth":1032,"text":2288},{"id":2429,"depth":1032,"text":2430},"Build evlog support for an HTTP framework (or non-HTTP runtime) without a built-in integration. Use defineFrameworkIntegration for the (ctx, next) middleware shape, or createMiddlewareLogger \u002F createRequestLogger for everything else.","md",[2484,2486],{"label":2437,"icon":387,"to":385,"color":2418,"variant":2485},"subtle",{"label":2443,"icon":337,"to":372,"color":2418,"variant":2485},{},{"title":353,"icon":356},{"title":426,"description":2481},"4C7I_0CwXGImfs_SKDdIQfrIjbuu1BVs65yhEN2yvuk",[2492,2494],{"title":348,"path":349,"stem":350,"description":2493,"icon":351,"children":-1},"Subscribe to wide events flowing through evlog — in-process with createStreamDrain, or over the network with the local SSE stream server.",{"title":358,"path":359,"stem":360,"description":2495,"icon":361,"children":-1},"Replay and tail the local NDJSON drain with readFsLogs and tailFsLogs — works in-process or from any external Node tool, survives restarts.",1778350402185]