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