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