[{"data":1,"prerenderedAt":3514},["ShallowReactive",2],{"navigation_docs":3,"-frameworks-tanstack-start":427,"-frameworks-tanstack-start-surround":3509},[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":231,"body":429,"description":3499,"extension":3500,"links":3501,"meta":3505,"navigation":3506,"path":232,"seo":3507,"stem":233,"__hash__":3508},"docs\u002F4.frameworks\u002F05.tanstack-start.md",{"type":430,"value":431,"toc":3479},"minimark",[432,446,461,504,508,515,520,591,598,612,798,809,813,836,976,979,998,1001,1015,1379,1382,1453,1462,1466,1480,2012,2015,2091,2095,2101,2339,2342,2353,2357,2368,2610,2614,2621,2744,2919,2926,2930,2937,3176,3187,3191,3198,3372,3376,3418,3426,3436,3440,3446,3475],[433,434,435,436,440,441,445],"p",{},"TanStack Start uses ",[437,438,439],"a",{"href":227},"Nitro v3"," as its server layer, so evlog integrates via the ",[442,443,444],"code",{},"evlog\u002Fnitro\u002Fv3"," module. The same plugin-based hooks system applies.",[447,448,450,454,455,457,458,460],"callout",{"color":449,"icon":13},"info",[451,452,453],"strong",{},"TanStack Router vs TanStack Start",": TanStack Router is a client-side router and doesn't need server-side logging. This page covers ",[451,456,231],{},", the full-stack framework. If you're using TanStack Router in SPA mode, see ",[437,459,66],{"href":67}," instead.",[462,463,466,469,491],"prompt",{":actions":464,"description":465,"icon":234},"[\"copy\",\"cursor\",\"windsurf\"]","Set up evlog in my TanStack Start app",[433,467,468],{},"Set up evlog in my TanStack Start app.",[470,471,472,476,479,482,485,488],"ul",{},[473,474,475],"li",{},"Install evlog: pnpm add evlog",[473,477,478],{},"Create nitro.config.ts with evlog\u002Fnitro\u002Fv3 module and experimental.asyncContext enabled",[473,480,481],{},"Configure env.service with your app name",[473,483,484],{},"Add evlogErrorHandler middleware to the root route for structured error responses",[473,486,487],{},"Access the logger via useRequest().context.log in route handlers",[473,489,490],{},"Use log.set() to accumulate context, throw createError() for structured errors",[433,492,493,494,499,500],{},"Docs: ",[437,495,496],{"href":496,"rel":497},"https:\u002F\u002Fwww.evlog.dev\u002Fframeworks\u002Ftanstack-start",[498],"nofollow","\nAdapters: ",[437,501,502],{"href":502,"rel":503},"https:\u002F\u002Fwww.evlog.dev\u002Fadapters",[498],[505,506,20],"h2",{"id":507},"quick-start",[433,509,510,511,514],{},"Starting from a TanStack Start project created with ",[442,512,513],{},"npm create @tanstack\u002Fstart@latest",":",[516,517,519],"h3",{"id":518},"_1-install","1. Install",[521,522,523,548,562,576],"code-group",{},[524,525,531],"pre",{"className":526,"code":527,"filename":528,"language":529,"meta":530,"style":530},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm add evlog\n","pnpm","bash","",[442,532,533],{"__ignoreMap":530},[534,535,538,541,545],"span",{"class":536,"line":537},"line",1,[534,539,528],{"class":540},"sBMFI",[534,542,544],{"class":543},"sfazB"," add",[534,546,547],{"class":543}," evlog\n",[524,549,552],{"className":526,"code":550,"filename":551,"language":529,"meta":530,"style":530},"bun add evlog\n","bun",[442,553,554],{"__ignoreMap":530},[534,555,556,558,560],{"class":536,"line":537},[534,557,551],{"class":540},[534,559,544],{"class":543},[534,561,547],{"class":543},[524,563,566],{"className":526,"code":564,"filename":565,"language":529,"meta":530,"style":530},"yarn add evlog\n","yarn",[442,567,568],{"__ignoreMap":530},[534,569,570,572,574],{"class":536,"line":537},[534,571,565],{"class":540},[534,573,544],{"class":543},[534,575,547],{"class":543},[524,577,580],{"className":526,"code":578,"filename":579,"language":529,"meta":530,"style":530},"npm install evlog\n","npm",[442,581,582],{"__ignoreMap":530},[534,583,584,586,589],{"class":536,"line":537},[534,585,579],{"class":540},[534,587,588],{"class":543}," install",[534,590,547],{"class":543},[516,592,594,595],{"id":593},"_2-add-nitroconfigts","2. Add ",[442,596,597],{},"nitro.config.ts",[433,599,600,601,603,604,607,608,611],{},"Create a ",[442,602,597],{}," at the project root to register the evlog module. Your ",[442,605,606],{},"vite.config.ts"," already has the ",[442,609,610],{},"nitro()"," plugin from the CLI, so no changes are needed there.",[524,613,617],{"className":614,"code":615,"filename":597,"language":616,"meta":530,"style":530},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { defineConfig } from 'nitro'\nimport evlog from 'evlog\u002Fnitro\u002Fv3'\n\nexport default defineConfig({\n  experimental: {\n    asyncContext: true,\n  },\n  modules: [\n    evlog({\n      env: { service: 'my-app' },\n    }),\n  ],\n})\n","typescript",[442,618,619,648,665,672,690,702,717,723,734,744,770,781,789],{"__ignoreMap":530},[534,620,621,625,629,633,636,639,642,645],{"class":536,"line":537},[534,622,624],{"class":623},"s7zQu","import",[534,626,628],{"class":627},"sMK4o"," {",[534,630,632],{"class":631},"sTEyZ"," defineConfig",[534,634,635],{"class":627}," }",[534,637,638],{"class":623}," from",[534,640,641],{"class":627}," '",[534,643,644],{"class":543},"nitro",[534,646,647],{"class":627},"'\n",[534,649,651,653,656,659,661,663],{"class":536,"line":650},2,[534,652,624],{"class":623},[534,654,655],{"class":631}," evlog ",[534,657,658],{"class":623},"from",[534,660,641],{"class":627},[534,662,444],{"class":543},[534,664,647],{"class":627},[534,666,668],{"class":536,"line":667},3,[534,669,671],{"emptyLinePlaceholder":670},true,"\n",[534,673,675,678,681,684,687],{"class":536,"line":674},4,[534,676,677],{"class":623},"export",[534,679,680],{"class":623}," default",[534,682,632],{"class":683},"s2Zo4",[534,685,686],{"class":631},"(",[534,688,689],{"class":627},"{\n",[534,691,693,697,699],{"class":536,"line":692},5,[534,694,696],{"class":695},"swJcz","  experimental",[534,698,514],{"class":627},[534,700,701],{"class":627}," {\n",[534,703,705,708,710,714],{"class":536,"line":704},6,[534,706,707],{"class":695},"    asyncContext",[534,709,514],{"class":627},[534,711,713],{"class":712},"sfNiH"," true",[534,715,716],{"class":627},",\n",[534,718,720],{"class":536,"line":719},7,[534,721,722],{"class":627},"  },\n",[534,724,726,729,731],{"class":536,"line":725},8,[534,727,728],{"class":695},"  modules",[534,730,514],{"class":627},[534,732,733],{"class":631}," [\n",[534,735,737,740,742],{"class":536,"line":736},9,[534,738,739],{"class":683},"    evlog",[534,741,686],{"class":631},[534,743,689],{"class":627},[534,745,747,750,752,754,757,759,761,764,767],{"class":536,"line":746},10,[534,748,749],{"class":695},"      env",[534,751,514],{"class":627},[534,753,628],{"class":627},[534,755,756],{"class":695}," service",[534,758,514],{"class":627},[534,760,641],{"class":627},[534,762,763],{"class":543},"my-app",[534,765,766],{"class":627},"'",[534,768,769],{"class":627}," },\n",[534,771,773,776,779],{"class":536,"line":772},11,[534,774,775],{"class":627},"    }",[534,777,778],{"class":631},")",[534,780,716],{"class":627},[534,782,784,787],{"class":536,"line":783},12,[534,785,786],{"class":631},"  ]",[534,788,716],{"class":627},[534,790,792,795],{"class":536,"line":791},13,[534,793,794],{"class":627},"}",[534,796,797],{"class":631},")\n",[433,799,800,801,804,805,808],{},"Enabling ",[442,802,803],{},"asyncContext"," lets you access the request-scoped logger from anywhere in the call stack via ",[442,806,807],{},"useRequest()",".",[516,810,812],{"id":811},"_3-error-handling-middleware","3. Error handling middleware",[433,814,815,816,819,820,823,824,827,828,831,832,835],{},"TanStack Start has its own error handling layer that runs before Nitro's. To ensure ",[442,817,818],{},"throw createError()"," returns a proper JSON response with ",[442,821,822],{},"why",", ",[442,825,826],{},"fix",", and ",[442,829,830],{},"link",", add the ",[442,833,834],{},"evlogErrorHandler"," middleware to your root route:",[524,837,840],{"className":614,"code":838,"filename":839,"language":616,"meta":530,"style":530},"import { createRootRoute } from '@tanstack\u002Freact-router'\nimport { createMiddleware } from '@tanstack\u002Freact-start'\nimport { evlogErrorHandler } from 'evlog\u002Fnitro\u002Fv3'\n\nexport const Route = createRootRoute({\n  server: {\n    middleware: [createMiddleware().server(evlogErrorHandler)],\n  },\n  \u002F\u002F ... head, shellComponent, etc.\n})\n","src\u002Froutes\u002F__root.tsx",[442,841,842,862,882,901,905,925,934,960,964,970],{"__ignoreMap":530},[534,843,844,846,848,851,853,855,857,860],{"class":536,"line":537},[534,845,624],{"class":623},[534,847,628],{"class":627},[534,849,850],{"class":631}," createRootRoute",[534,852,635],{"class":627},[534,854,638],{"class":623},[534,856,641],{"class":627},[534,858,859],{"class":543},"@tanstack\u002Freact-router",[534,861,647],{"class":627},[534,863,864,866,868,871,873,875,877,880],{"class":536,"line":650},[534,865,624],{"class":623},[534,867,628],{"class":627},[534,869,870],{"class":631}," createMiddleware",[534,872,635],{"class":627},[534,874,638],{"class":623},[534,876,641],{"class":627},[534,878,879],{"class":543},"@tanstack\u002Freact-start",[534,881,647],{"class":627},[534,883,884,886,888,891,893,895,897,899],{"class":536,"line":667},[534,885,624],{"class":623},[534,887,628],{"class":627},[534,889,890],{"class":631}," evlogErrorHandler",[534,892,635],{"class":627},[534,894,638],{"class":623},[534,896,641],{"class":627},[534,898,444],{"class":543},[534,900,647],{"class":627},[534,902,903],{"class":536,"line":674},[534,904,671],{"emptyLinePlaceholder":670},[534,906,907,909,913,916,919,921,923],{"class":536,"line":692},[534,908,677],{"class":623},[534,910,912],{"class":911},"spNyl"," const",[534,914,915],{"class":631}," Route ",[534,917,918],{"class":627},"=",[534,920,850],{"class":683},[534,922,686],{"class":631},[534,924,689],{"class":627},[534,926,927,930,932],{"class":536,"line":704},[534,928,929],{"class":695},"  server",[534,931,514],{"class":627},[534,933,701],{"class":627},[534,935,936,939,941,944,947,950,952,955,958],{"class":536,"line":719},[534,937,938],{"class":695},"    middleware",[534,940,514],{"class":627},[534,942,943],{"class":631}," [",[534,945,946],{"class":683},"createMiddleware",[534,948,949],{"class":631},"()",[534,951,808],{"class":627},[534,953,954],{"class":683},"server",[534,956,957],{"class":631},"(evlogErrorHandler)]",[534,959,716],{"class":627},[534,961,962],{"class":536,"line":725},[534,963,722],{"class":627},[534,965,966],{"class":536,"line":736},[534,967,969],{"class":968},"sHwdD","  \u002F\u002F ... head, shellComponent, etc.\n",[534,971,972,974],{"class":536,"line":746},[534,973,794],{"class":627},[534,975,797],{"class":631},[433,977,978],{},"That's it. evlog automatically captures every request as a wide event with method, path, status, and duration.",[447,980,981,984,985,990,991,994,995,997],{"color":449,"icon":195},[451,982,983],{},"Using Vite?"," TanStack Start is Vite-based. The ",[437,986,987],{"href":193},[442,988,989],{},"evlog\u002Fvite"," plugin strips ",[442,992,993],{},"log.debug()"," from production builds and injects source locations, add it to your ",[442,996,606],{}," alongside the TanStack Start plugin.",[505,999,51],{"id":1000},"wide-events",[433,1002,1003,1004,1007,1008,1010,1011,1014],{},"With ",[442,1005,1006],{},"experimental.asyncContext: true",", use ",[442,1009,807],{}," from ",[442,1012,1013],{},"nitro\u002Fcontext"," to access the request-scoped logger and build up context progressively:",[524,1016,1019],{"className":614,"code":1017,"filename":1018,"language":616,"meta":530,"style":530},"import { createFileRoute } from '@tanstack\u002Freact-router'\nimport { useRequest } from 'nitro\u002Fcontext'\nimport type { RequestLogger } from 'evlog'\n\nexport const Route = createFileRoute('\u002Fapi\u002Fhello')({\n  server: {\n    handlers: {\n      GET: async () => {\n        const req = useRequest()\n        const log = req.context.log as RequestLogger\n\n        log.set({ user: { id: 'user_123', plan: 'pro' } })\n        log.set({ action: 'fetch_profile' })\n        log.set({ cache: { hit: true, ttl: 3600 } })\n\n        return Response.json({ ok: true })\n      },\n    },\n  },\n})\n","src\u002Froutes\u002Fapi\u002Fhello.ts",[442,1020,1021,1040,1059,1082,1086,1112,1120,1129,1147,1163,1190,1194,1249,1277,1321,1326,1355,1361,1367,1372],{"__ignoreMap":530},[534,1022,1023,1025,1027,1030,1032,1034,1036,1038],{"class":536,"line":537},[534,1024,624],{"class":623},[534,1026,628],{"class":627},[534,1028,1029],{"class":631}," createFileRoute",[534,1031,635],{"class":627},[534,1033,638],{"class":623},[534,1035,641],{"class":627},[534,1037,859],{"class":543},[534,1039,647],{"class":627},[534,1041,1042,1044,1046,1049,1051,1053,1055,1057],{"class":536,"line":650},[534,1043,624],{"class":623},[534,1045,628],{"class":627},[534,1047,1048],{"class":631}," useRequest",[534,1050,635],{"class":627},[534,1052,638],{"class":623},[534,1054,641],{"class":627},[534,1056,1013],{"class":543},[534,1058,647],{"class":627},[534,1060,1061,1063,1066,1068,1071,1073,1075,1077,1080],{"class":536,"line":667},[534,1062,624],{"class":623},[534,1064,1065],{"class":623}," type",[534,1067,628],{"class":627},[534,1069,1070],{"class":631}," RequestLogger",[534,1072,635],{"class":627},[534,1074,638],{"class":623},[534,1076,641],{"class":627},[534,1078,1079],{"class":543},"evlog",[534,1081,647],{"class":627},[534,1083,1084],{"class":536,"line":674},[534,1085,671],{"emptyLinePlaceholder":670},[534,1087,1088,1090,1092,1094,1096,1098,1100,1102,1105,1107,1110],{"class":536,"line":692},[534,1089,677],{"class":623},[534,1091,912],{"class":911},[534,1093,915],{"class":631},[534,1095,918],{"class":627},[534,1097,1029],{"class":683},[534,1099,686],{"class":631},[534,1101,766],{"class":627},[534,1103,1104],{"class":543},"\u002Fapi\u002Fhello",[534,1106,766],{"class":627},[534,1108,1109],{"class":631},")(",[534,1111,689],{"class":627},[534,1113,1114,1116,1118],{"class":536,"line":704},[534,1115,929],{"class":695},[534,1117,514],{"class":627},[534,1119,701],{"class":627},[534,1121,1122,1125,1127],{"class":536,"line":719},[534,1123,1124],{"class":695},"    handlers",[534,1126,514],{"class":627},[534,1128,701],{"class":627},[534,1130,1131,1134,1136,1139,1142,1145],{"class":536,"line":725},[534,1132,1133],{"class":683},"      GET",[534,1135,514],{"class":627},[534,1137,1138],{"class":911}," async",[534,1140,1141],{"class":627}," ()",[534,1143,1144],{"class":911}," =>",[534,1146,701],{"class":627},[534,1148,1149,1152,1155,1158,1160],{"class":536,"line":736},[534,1150,1151],{"class":911},"        const",[534,1153,1154],{"class":631}," req",[534,1156,1157],{"class":627}," =",[534,1159,1048],{"class":683},[534,1161,1162],{"class":695},"()\n",[534,1164,1165,1167,1170,1172,1174,1176,1179,1181,1184,1187],{"class":536,"line":746},[534,1166,1151],{"class":911},[534,1168,1169],{"class":631}," log",[534,1171,1157],{"class":627},[534,1173,1154],{"class":631},[534,1175,808],{"class":627},[534,1177,1178],{"class":631},"context",[534,1180,808],{"class":627},[534,1182,1183],{"class":631},"log",[534,1185,1186],{"class":623}," as",[534,1188,1189],{"class":540}," RequestLogger\n",[534,1191,1192],{"class":536,"line":772},[534,1193,671],{"emptyLinePlaceholder":670},[534,1195,1196,1199,1201,1204,1206,1209,1212,1214,1216,1219,1221,1223,1226,1228,1231,1234,1236,1238,1241,1243,1245,1247],{"class":536,"line":783},[534,1197,1198],{"class":631},"        log",[534,1200,808],{"class":627},[534,1202,1203],{"class":683},"set",[534,1205,686],{"class":695},[534,1207,1208],{"class":627},"{",[534,1210,1211],{"class":695}," user",[534,1213,514],{"class":627},[534,1215,628],{"class":627},[534,1217,1218],{"class":695}," id",[534,1220,514],{"class":627},[534,1222,641],{"class":627},[534,1224,1225],{"class":543},"user_123",[534,1227,766],{"class":627},[534,1229,1230],{"class":627},",",[534,1232,1233],{"class":695}," plan",[534,1235,514],{"class":627},[534,1237,641],{"class":627},[534,1239,1240],{"class":543},"pro",[534,1242,766],{"class":627},[534,1244,635],{"class":627},[534,1246,635],{"class":627},[534,1248,797],{"class":695},[534,1250,1251,1253,1255,1257,1259,1261,1264,1266,1268,1271,1273,1275],{"class":536,"line":791},[534,1252,1198],{"class":631},[534,1254,808],{"class":627},[534,1256,1203],{"class":683},[534,1258,686],{"class":695},[534,1260,1208],{"class":627},[534,1262,1263],{"class":695}," action",[534,1265,514],{"class":627},[534,1267,641],{"class":627},[534,1269,1270],{"class":543},"fetch_profile",[534,1272,766],{"class":627},[534,1274,635],{"class":627},[534,1276,797],{"class":695},[534,1278,1280,1282,1284,1286,1288,1290,1293,1295,1297,1300,1302,1304,1306,1309,1311,1315,1317,1319],{"class":536,"line":1279},14,[534,1281,1198],{"class":631},[534,1283,808],{"class":627},[534,1285,1203],{"class":683},[534,1287,686],{"class":695},[534,1289,1208],{"class":627},[534,1291,1292],{"class":695}," cache",[534,1294,514],{"class":627},[534,1296,628],{"class":627},[534,1298,1299],{"class":695}," hit",[534,1301,514],{"class":627},[534,1303,713],{"class":712},[534,1305,1230],{"class":627},[534,1307,1308],{"class":695}," ttl",[534,1310,514],{"class":627},[534,1312,1314],{"class":1313},"sbssI"," 3600",[534,1316,635],{"class":627},[534,1318,635],{"class":627},[534,1320,797],{"class":695},[534,1322,1324],{"class":536,"line":1323},15,[534,1325,671],{"emptyLinePlaceholder":670},[534,1327,1329,1332,1335,1337,1340,1342,1344,1347,1349,1351,1353],{"class":536,"line":1328},16,[534,1330,1331],{"class":623},"        return",[534,1333,1334],{"class":631}," Response",[534,1336,808],{"class":627},[534,1338,1339],{"class":683},"json",[534,1341,686],{"class":695},[534,1343,1208],{"class":627},[534,1345,1346],{"class":695}," ok",[534,1348,514],{"class":627},[534,1350,713],{"class":712},[534,1352,635],{"class":627},[534,1354,797],{"class":695},[534,1356,1358],{"class":536,"line":1357},17,[534,1359,1360],{"class":627},"      },\n",[534,1362,1364],{"class":536,"line":1363},18,[534,1365,1366],{"class":627},"    },\n",[534,1368,1370],{"class":536,"line":1369},19,[534,1371,722],{"class":627},[534,1373,1375,1377],{"class":536,"line":1374},20,[534,1376,794],{"class":627},[534,1378,797],{"class":631},[433,1380,1381],{},"All fields are merged into a single wide event emitted when the request completes:",[524,1383,1386],{"className":526,"code":1384,"filename":1385,"language":529,"meta":530,"style":530},"14:58:15 INFO [my-app] GET \u002Fapi\u002Fhello 200 in 52ms\n  ├─ cache: hit=true ttl=3600\n  ├─ action: fetch_profile\n  ├─ user: id=user_123 plan=pro\n  └─ requestId: 4a8ff3a8-...\n","Terminal output",[442,1387,1388,1399,1419,1429,1442],{"__ignoreMap":530},[534,1389,1390,1393,1396],{"class":536,"line":537},[534,1391,1392],{"class":540},"14:58:15",[534,1394,1395],{"class":543}," INFO",[534,1397,1398],{"class":631}," [my-app] GET \u002Fapi\u002Fhello 200 in 52ms\n",[534,1400,1401,1404,1407,1410,1413,1416],{"class":536,"line":650},[534,1402,1403],{"class":540},"  ├─",[534,1405,1406],{"class":543}," cache:",[534,1408,1409],{"class":543}," hit=",[534,1411,1412],{"class":627},"true",[534,1414,1415],{"class":543}," ttl=",[534,1417,1418],{"class":1313},"3600\n",[534,1420,1421,1423,1426],{"class":536,"line":667},[534,1422,1403],{"class":540},[534,1424,1425],{"class":543}," action:",[534,1427,1428],{"class":543}," fetch_profile\n",[534,1430,1431,1433,1436,1439],{"class":536,"line":674},[534,1432,1403],{"class":540},[534,1434,1435],{"class":543}," user:",[534,1437,1438],{"class":543}," id=user_123",[534,1440,1441],{"class":543}," plan=pro\n",[534,1443,1444,1447,1450],{"class":536,"line":692},[534,1445,1446],{"class":540},"  └─",[534,1448,1449],{"class":543}," requestId:",[534,1451,1452],{"class":543}," 4a8ff3a8-...\n",[447,1454,1455,1457,1458,1461],{"color":449,"icon":13},[442,1456,807],{}," is an experimental Nitro v3 feature powered by ",[442,1459,1460],{},"AsyncLocalStorage",". It works on Node.js and Bun runtimes.",[505,1463,1465],{"id":1464},"error-handling","Error Handling",[433,1467,1468,1469,1472,1473,823,1475,827,1477,1479],{},"Use ",[442,1470,1471],{},"createError"," for structured errors with ",[442,1474,822],{},[442,1476,826],{},[442,1478,830],{}," fields:",[524,1481,1484],{"className":614,"code":1482,"filename":1483,"language":616,"meta":530,"style":530},"import { createFileRoute } from '@tanstack\u002Freact-router'\nimport { useRequest } from 'nitro\u002Fcontext'\nimport { createError } from 'evlog'\nimport type { RequestLogger } from 'evlog'\n\nexport const Route = createFileRoute('\u002Fapi\u002Fcheckout')({\n  server: {\n    handlers: {\n      POST: async ({ request }) => {\n        const req = useRequest()\n        const log = req.context.log as RequestLogger\n        const body = await request.json()\n\n        log.set({ user: { id: body.userId, plan: body.plan } })\n        log.set({ cart: { items: body.items, total: body.total } })\n\n        const result = await chargeCard(body)\n\n        if (!result.success) {\n          throw createError({\n            message: 'Payment failed',\n            status: 402,\n            why: 'Card declined by issuer',\n            fix: 'Try a different payment method',\n            link: 'https:\u002F\u002Fdocs.example.com\u002Fpayments\u002Fdeclined',\n          })\n        }\n\n        return Response.json({ success: true, orderId: result.orderId })\n      },\n    },\n  },\n})\n","src\u002Froutes\u002Fapi\u002Fcheckout.ts",[442,1485,1486,1504,1522,1541,1561,1565,1590,1598,1606,1629,1641,1663,1683,1687,1735,1786,1790,1811,1815,1839,1850,1867,1880,1897,1914,1931,1939,1945,1950,1990,1995,2000,2005],{"__ignoreMap":530},[534,1487,1488,1490,1492,1494,1496,1498,1500,1502],{"class":536,"line":537},[534,1489,624],{"class":623},[534,1491,628],{"class":627},[534,1493,1029],{"class":631},[534,1495,635],{"class":627},[534,1497,638],{"class":623},[534,1499,641],{"class":627},[534,1501,859],{"class":543},[534,1503,647],{"class":627},[534,1505,1506,1508,1510,1512,1514,1516,1518,1520],{"class":536,"line":650},[534,1507,624],{"class":623},[534,1509,628],{"class":627},[534,1511,1048],{"class":631},[534,1513,635],{"class":627},[534,1515,638],{"class":623},[534,1517,641],{"class":627},[534,1519,1013],{"class":543},[534,1521,647],{"class":627},[534,1523,1524,1526,1528,1531,1533,1535,1537,1539],{"class":536,"line":667},[534,1525,624],{"class":623},[534,1527,628],{"class":627},[534,1529,1530],{"class":631}," createError",[534,1532,635],{"class":627},[534,1534,638],{"class":623},[534,1536,641],{"class":627},[534,1538,1079],{"class":543},[534,1540,647],{"class":627},[534,1542,1543,1545,1547,1549,1551,1553,1555,1557,1559],{"class":536,"line":674},[534,1544,624],{"class":623},[534,1546,1065],{"class":623},[534,1548,628],{"class":627},[534,1550,1070],{"class":631},[534,1552,635],{"class":627},[534,1554,638],{"class":623},[534,1556,641],{"class":627},[534,1558,1079],{"class":543},[534,1560,647],{"class":627},[534,1562,1563],{"class":536,"line":692},[534,1564,671],{"emptyLinePlaceholder":670},[534,1566,1567,1569,1571,1573,1575,1577,1579,1581,1584,1586,1588],{"class":536,"line":704},[534,1568,677],{"class":623},[534,1570,912],{"class":911},[534,1572,915],{"class":631},[534,1574,918],{"class":627},[534,1576,1029],{"class":683},[534,1578,686],{"class":631},[534,1580,766],{"class":627},[534,1582,1583],{"class":543},"\u002Fapi\u002Fcheckout",[534,1585,766],{"class":627},[534,1587,1109],{"class":631},[534,1589,689],{"class":627},[534,1591,1592,1594,1596],{"class":536,"line":719},[534,1593,929],{"class":695},[534,1595,514],{"class":627},[534,1597,701],{"class":627},[534,1599,1600,1602,1604],{"class":536,"line":725},[534,1601,1124],{"class":695},[534,1603,514],{"class":627},[534,1605,701],{"class":627},[534,1607,1608,1611,1613,1615,1618,1622,1625,1627],{"class":536,"line":736},[534,1609,1610],{"class":683},"      POST",[534,1612,514],{"class":627},[534,1614,1138],{"class":911},[534,1616,1617],{"class":627}," ({",[534,1619,1621],{"class":1620},"sHdIc"," request",[534,1623,1624],{"class":627}," })",[534,1626,1144],{"class":911},[534,1628,701],{"class":627},[534,1630,1631,1633,1635,1637,1639],{"class":536,"line":746},[534,1632,1151],{"class":911},[534,1634,1154],{"class":631},[534,1636,1157],{"class":627},[534,1638,1048],{"class":683},[534,1640,1162],{"class":695},[534,1642,1643,1645,1647,1649,1651,1653,1655,1657,1659,1661],{"class":536,"line":772},[534,1644,1151],{"class":911},[534,1646,1169],{"class":631},[534,1648,1157],{"class":627},[534,1650,1154],{"class":631},[534,1652,808],{"class":627},[534,1654,1178],{"class":631},[534,1656,808],{"class":627},[534,1658,1183],{"class":631},[534,1660,1186],{"class":623},[534,1662,1189],{"class":540},[534,1664,1665,1667,1670,1672,1675,1677,1679,1681],{"class":536,"line":783},[534,1666,1151],{"class":911},[534,1668,1669],{"class":631}," body",[534,1671,1157],{"class":627},[534,1673,1674],{"class":623}," await",[534,1676,1621],{"class":631},[534,1678,808],{"class":627},[534,1680,1339],{"class":683},[534,1682,1162],{"class":695},[534,1684,1685],{"class":536,"line":791},[534,1686,671],{"emptyLinePlaceholder":670},[534,1688,1689,1691,1693,1695,1697,1699,1701,1703,1705,1707,1709,1711,1713,1716,1718,1720,1722,1724,1726,1729,1731,1733],{"class":536,"line":1279},[534,1690,1198],{"class":631},[534,1692,808],{"class":627},[534,1694,1203],{"class":683},[534,1696,686],{"class":695},[534,1698,1208],{"class":627},[534,1700,1211],{"class":695},[534,1702,514],{"class":627},[534,1704,628],{"class":627},[534,1706,1218],{"class":695},[534,1708,514],{"class":627},[534,1710,1669],{"class":631},[534,1712,808],{"class":627},[534,1714,1715],{"class":631},"userId",[534,1717,1230],{"class":627},[534,1719,1233],{"class":695},[534,1721,514],{"class":627},[534,1723,1669],{"class":631},[534,1725,808],{"class":627},[534,1727,1728],{"class":631},"plan",[534,1730,635],{"class":627},[534,1732,635],{"class":627},[534,1734,797],{"class":695},[534,1736,1737,1739,1741,1743,1745,1747,1750,1752,1754,1757,1759,1761,1763,1766,1768,1771,1773,1775,1777,1780,1782,1784],{"class":536,"line":1323},[534,1738,1198],{"class":631},[534,1740,808],{"class":627},[534,1742,1203],{"class":683},[534,1744,686],{"class":695},[534,1746,1208],{"class":627},[534,1748,1749],{"class":695}," cart",[534,1751,514],{"class":627},[534,1753,628],{"class":627},[534,1755,1756],{"class":695}," items",[534,1758,514],{"class":627},[534,1760,1669],{"class":631},[534,1762,808],{"class":627},[534,1764,1765],{"class":631},"items",[534,1767,1230],{"class":627},[534,1769,1770],{"class":695}," total",[534,1772,514],{"class":627},[534,1774,1669],{"class":631},[534,1776,808],{"class":627},[534,1778,1779],{"class":631},"total",[534,1781,635],{"class":627},[534,1783,635],{"class":627},[534,1785,797],{"class":695},[534,1787,1788],{"class":536,"line":1328},[534,1789,671],{"emptyLinePlaceholder":670},[534,1791,1792,1794,1797,1799,1801,1804,1806,1809],{"class":536,"line":1357},[534,1793,1151],{"class":911},[534,1795,1796],{"class":631}," result",[534,1798,1157],{"class":627},[534,1800,1674],{"class":623},[534,1802,1803],{"class":683}," chargeCard",[534,1805,686],{"class":695},[534,1807,1808],{"class":631},"body",[534,1810,797],{"class":695},[534,1812,1813],{"class":536,"line":1363},[534,1814,671],{"emptyLinePlaceholder":670},[534,1816,1817,1820,1823,1826,1829,1831,1834,1837],{"class":536,"line":1369},[534,1818,1819],{"class":623},"        if",[534,1821,1822],{"class":695}," (",[534,1824,1825],{"class":627},"!",[534,1827,1828],{"class":631},"result",[534,1830,808],{"class":627},[534,1832,1833],{"class":631},"success",[534,1835,1836],{"class":695},") ",[534,1838,689],{"class":627},[534,1840,1841,1844,1846,1848],{"class":536,"line":1374},[534,1842,1843],{"class":623},"          throw",[534,1845,1530],{"class":683},[534,1847,686],{"class":695},[534,1849,689],{"class":627},[534,1851,1853,1856,1858,1860,1863,1865],{"class":536,"line":1852},21,[534,1854,1855],{"class":695},"            message",[534,1857,514],{"class":627},[534,1859,641],{"class":627},[534,1861,1862],{"class":543},"Payment failed",[534,1864,766],{"class":627},[534,1866,716],{"class":627},[534,1868,1870,1873,1875,1878],{"class":536,"line":1869},22,[534,1871,1872],{"class":695},"            status",[534,1874,514],{"class":627},[534,1876,1877],{"class":1313}," 402",[534,1879,716],{"class":627},[534,1881,1883,1886,1888,1890,1893,1895],{"class":536,"line":1882},23,[534,1884,1885],{"class":695},"            why",[534,1887,514],{"class":627},[534,1889,641],{"class":627},[534,1891,1892],{"class":543},"Card declined by issuer",[534,1894,766],{"class":627},[534,1896,716],{"class":627},[534,1898,1900,1903,1905,1907,1910,1912],{"class":536,"line":1899},24,[534,1901,1902],{"class":695},"            fix",[534,1904,514],{"class":627},[534,1906,641],{"class":627},[534,1908,1909],{"class":543},"Try a different payment method",[534,1911,766],{"class":627},[534,1913,716],{"class":627},[534,1915,1917,1920,1922,1924,1927,1929],{"class":536,"line":1916},25,[534,1918,1919],{"class":695},"            link",[534,1921,514],{"class":627},[534,1923,641],{"class":627},[534,1925,1926],{"class":543},"https:\u002F\u002Fdocs.example.com\u002Fpayments\u002Fdeclined",[534,1928,766],{"class":627},[534,1930,716],{"class":627},[534,1932,1934,1937],{"class":536,"line":1933},26,[534,1935,1936],{"class":627},"          }",[534,1938,797],{"class":695},[534,1940,1942],{"class":536,"line":1941},27,[534,1943,1944],{"class":627},"        }\n",[534,1946,1948],{"class":536,"line":1947},28,[534,1949,671],{"emptyLinePlaceholder":670},[534,1951,1953,1955,1957,1959,1961,1963,1965,1968,1970,1972,1974,1977,1979,1981,1983,1986,1988],{"class":536,"line":1952},29,[534,1954,1331],{"class":623},[534,1956,1334],{"class":631},[534,1958,808],{"class":627},[534,1960,1339],{"class":683},[534,1962,686],{"class":695},[534,1964,1208],{"class":627},[534,1966,1967],{"class":695}," success",[534,1969,514],{"class":627},[534,1971,713],{"class":712},[534,1973,1230],{"class":627},[534,1975,1976],{"class":695}," orderId",[534,1978,514],{"class":627},[534,1980,1796],{"class":631},[534,1982,808],{"class":627},[534,1984,1985],{"class":631},"orderId",[534,1987,635],{"class":627},[534,1989,797],{"class":695},[534,1991,1993],{"class":536,"line":1992},30,[534,1994,1360],{"class":627},[534,1996,1998],{"class":536,"line":1997},31,[534,1999,1366],{"class":627},[534,2001,2003],{"class":536,"line":2002},32,[534,2004,722],{"class":627},[534,2006,2008,2010],{"class":536,"line":2007},33,[534,2009,794],{"class":627},[534,2011,797],{"class":631},[433,2013,2014],{},"The error is captured and logged with both the custom context and structured error fields:",[524,2016,2018],{"className":526,"code":2017,"filename":1385,"language":529,"meta":530,"style":530},"14:58:20 ERROR [my-app] POST \u002Fapi\u002Fcheckout 402 in 104ms\n  ├─ error: name=EvlogError message=Payment failed status=402\n  ├─ cart: items=3 total=9999\n  ├─ user: id=user_123 plan=pro\n  └─ requestId: 880a50ac-...\n",[442,2019,2020,2031,2053,2072,2082],{"__ignoreMap":530},[534,2021,2022,2025,2028],{"class":536,"line":537},[534,2023,2024],{"class":540},"14:58:20",[534,2026,2027],{"class":543}," ERROR",[534,2029,2030],{"class":631}," [my-app] POST \u002Fapi\u002Fcheckout 402 in 104ms\n",[534,2032,2033,2035,2038,2041,2044,2047,2050],{"class":536,"line":650},[534,2034,1403],{"class":540},[534,2036,2037],{"class":543}," error:",[534,2039,2040],{"class":543}," name=EvlogError",[534,2042,2043],{"class":543}," message=Payment",[534,2045,2046],{"class":543}," failed",[534,2048,2049],{"class":543}," status=",[534,2051,2052],{"class":1313},"402\n",[534,2054,2055,2057,2060,2063,2066,2069],{"class":536,"line":667},[534,2056,1403],{"class":540},[534,2058,2059],{"class":543}," cart:",[534,2061,2062],{"class":543}," items=",[534,2064,2065],{"class":1313},"3",[534,2067,2068],{"class":543}," total=",[534,2070,2071],{"class":1313},"9999\n",[534,2073,2074,2076,2078,2080],{"class":536,"line":674},[534,2075,1403],{"class":540},[534,2077,1435],{"class":543},[534,2079,1438],{"class":543},[534,2081,1441],{"class":543},[534,2083,2084,2086,2088],{"class":536,"line":692},[534,2085,1446],{"class":540},[534,2087,1449],{"class":543},[534,2089,2090],{"class":543}," 880a50ac-...\n",[516,2092,2094],{"id":2093},"parsing-errors-on-the-client","Parsing Errors on the Client",[433,2096,1468,2097,2100],{},[442,2098,2099],{},"parseError"," to extract the structured fields from any error response:",[524,2102,2107],{"className":2103,"code":2104,"filename":2105,"language":2106,"meta":530,"style":530},"language-tsx shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { parseError } from 'evlog'\n\ntry {\n  const res = await fetch('\u002Fapi\u002Fcheckout', {\n    method: 'POST',\n    body: JSON.stringify({ userId: 'user_123' }),\n  })\n  if (!res.ok) throw { data: await res.json(), status: res.status }\n} catch (error) {\n  const { message, status, why, fix, link } = parseError(error)\n}\n","src\u002Froutes\u002Fcheckout.tsx","tsx",[442,2108,2109,2128,2132,2139,2166,2182,2218,2225,2281,2293,2334],{"__ignoreMap":530},[534,2110,2111,2113,2115,2118,2120,2122,2124,2126],{"class":536,"line":537},[534,2112,624],{"class":623},[534,2114,628],{"class":627},[534,2116,2117],{"class":631}," parseError",[534,2119,635],{"class":627},[534,2121,638],{"class":623},[534,2123,641],{"class":627},[534,2125,1079],{"class":543},[534,2127,647],{"class":627},[534,2129,2130],{"class":536,"line":650},[534,2131,671],{"emptyLinePlaceholder":670},[534,2133,2134,2137],{"class":536,"line":667},[534,2135,2136],{"class":623},"try",[534,2138,701],{"class":627},[534,2140,2141,2144,2147,2149,2151,2154,2156,2158,2160,2162,2164],{"class":536,"line":674},[534,2142,2143],{"class":911},"  const",[534,2145,2146],{"class":631}," res",[534,2148,1157],{"class":627},[534,2150,1674],{"class":623},[534,2152,2153],{"class":683}," fetch",[534,2155,686],{"class":695},[534,2157,766],{"class":627},[534,2159,1583],{"class":543},[534,2161,766],{"class":627},[534,2163,1230],{"class":627},[534,2165,701],{"class":627},[534,2167,2168,2171,2173,2175,2178,2180],{"class":536,"line":692},[534,2169,2170],{"class":695},"    method",[534,2172,514],{"class":627},[534,2174,641],{"class":627},[534,2176,2177],{"class":543},"POST",[534,2179,766],{"class":627},[534,2181,716],{"class":627},[534,2183,2184,2187,2189,2192,2194,2197,2199,2201,2204,2206,2208,2210,2212,2214,2216],{"class":536,"line":704},[534,2185,2186],{"class":695},"    body",[534,2188,514],{"class":627},[534,2190,2191],{"class":631}," JSON",[534,2193,808],{"class":627},[534,2195,2196],{"class":683},"stringify",[534,2198,686],{"class":695},[534,2200,1208],{"class":627},[534,2202,2203],{"class":695}," userId",[534,2205,514],{"class":627},[534,2207,641],{"class":627},[534,2209,1225],{"class":543},[534,2211,766],{"class":627},[534,2213,635],{"class":627},[534,2215,778],{"class":695},[534,2217,716],{"class":627},[534,2219,2220,2223],{"class":536,"line":719},[534,2221,2222],{"class":627},"  }",[534,2224,797],{"class":695},[534,2226,2227,2230,2232,2234,2237,2239,2242,2244,2247,2249,2252,2254,2256,2258,2260,2262,2264,2266,2269,2271,2273,2275,2278],{"class":536,"line":725},[534,2228,2229],{"class":623},"  if",[534,2231,1822],{"class":695},[534,2233,1825],{"class":627},[534,2235,2236],{"class":631},"res",[534,2238,808],{"class":627},[534,2240,2241],{"class":631},"ok",[534,2243,1836],{"class":695},[534,2245,2246],{"class":623},"throw",[534,2248,628],{"class":627},[534,2250,2251],{"class":695}," data",[534,2253,514],{"class":627},[534,2255,1674],{"class":623},[534,2257,2146],{"class":631},[534,2259,808],{"class":627},[534,2261,1339],{"class":683},[534,2263,949],{"class":695},[534,2265,1230],{"class":627},[534,2267,2268],{"class":695}," status",[534,2270,514],{"class":627},[534,2272,2146],{"class":631},[534,2274,808],{"class":627},[534,2276,2277],{"class":631},"status",[534,2279,2280],{"class":627}," }\n",[534,2282,2283,2285,2288,2291],{"class":536,"line":736},[534,2284,794],{"class":627},[534,2286,2287],{"class":623}," catch",[534,2289,2290],{"class":631}," (error) ",[534,2292,689],{"class":627},[534,2294,2295,2297,2299,2302,2304,2306,2308,2311,2313,2316,2318,2321,2323,2325,2327,2329,2332],{"class":536,"line":746},[534,2296,2143],{"class":911},[534,2298,628],{"class":627},[534,2300,2301],{"class":631}," message",[534,2303,1230],{"class":627},[534,2305,2268],{"class":631},[534,2307,1230],{"class":627},[534,2309,2310],{"class":631}," why",[534,2312,1230],{"class":627},[534,2314,2315],{"class":631}," fix",[534,2317,1230],{"class":627},[534,2319,2320],{"class":631}," link",[534,2322,635],{"class":627},[534,2324,1157],{"class":627},[534,2326,2117],{"class":683},[534,2328,686],{"class":695},[534,2330,2331],{"class":631},"error",[534,2333,797],{"class":695},[534,2335,2336],{"class":536,"line":772},[534,2337,2338],{"class":627},"}\n",[505,2340,170],{"id":2341},"configuration",[433,2343,2344,2345,2348,2349,2352],{},"See the ",[437,2346,2347],{"href":171},"Configuration reference"," for all available options (",[442,2350,2351],{},"initLogger",", middleware options, sampling, silent mode, etc.).",[505,2354,2356],{"id":2355},"route-filtering","Route Filtering",[433,2358,2359,2360,2363,2364,2367],{},"Control which routes are logged with ",[442,2361,2362],{},"include"," and ",[442,2365,2366],{},"exclude"," in the module options:",[524,2369,2371],{"className":614,"code":2370,"filename":597,"language":616,"meta":530,"style":530},"import { defineConfig } from 'nitro'\nimport evlog from 'evlog\u002Fnitro\u002Fv3'\n\nexport default defineConfig({\n  experimental: { asyncContext: true },\n  modules: [\n    evlog({\n      env: { service: 'my-app' },\n      include: ['\u002Fapi\u002F**'],\n      exclude: ['\u002F_internal\u002F**', '\u002Fhealth'],\n      routes: {\n        '\u002Fapi\u002Fauth\u002F**': { service: 'auth-service' },\n        '\u002Fapi\u002Fpayment\u002F**': { service: 'payment-service' },\n      },\n    }),\n  ],\n})\n",[442,2372,2373,2391,2405,2409,2421,2438,2446,2454,2474,2495,2524,2533,2560,2586,2590,2598,2604],{"__ignoreMap":530},[534,2374,2375,2377,2379,2381,2383,2385,2387,2389],{"class":536,"line":537},[534,2376,624],{"class":623},[534,2378,628],{"class":627},[534,2380,632],{"class":631},[534,2382,635],{"class":627},[534,2384,638],{"class":623},[534,2386,641],{"class":627},[534,2388,644],{"class":543},[534,2390,647],{"class":627},[534,2392,2393,2395,2397,2399,2401,2403],{"class":536,"line":650},[534,2394,624],{"class":623},[534,2396,655],{"class":631},[534,2398,658],{"class":623},[534,2400,641],{"class":627},[534,2402,444],{"class":543},[534,2404,647],{"class":627},[534,2406,2407],{"class":536,"line":667},[534,2408,671],{"emptyLinePlaceholder":670},[534,2410,2411,2413,2415,2417,2419],{"class":536,"line":674},[534,2412,677],{"class":623},[534,2414,680],{"class":623},[534,2416,632],{"class":683},[534,2418,686],{"class":631},[534,2420,689],{"class":627},[534,2422,2423,2425,2427,2429,2432,2434,2436],{"class":536,"line":692},[534,2424,696],{"class":695},[534,2426,514],{"class":627},[534,2428,628],{"class":627},[534,2430,2431],{"class":695}," asyncContext",[534,2433,514],{"class":627},[534,2435,713],{"class":712},[534,2437,769],{"class":627},[534,2439,2440,2442,2444],{"class":536,"line":704},[534,2441,728],{"class":695},[534,2443,514],{"class":627},[534,2445,733],{"class":631},[534,2447,2448,2450,2452],{"class":536,"line":719},[534,2449,739],{"class":683},[534,2451,686],{"class":631},[534,2453,689],{"class":627},[534,2455,2456,2458,2460,2462,2464,2466,2468,2470,2472],{"class":536,"line":725},[534,2457,749],{"class":695},[534,2459,514],{"class":627},[534,2461,628],{"class":627},[534,2463,756],{"class":695},[534,2465,514],{"class":627},[534,2467,641],{"class":627},[534,2469,763],{"class":543},[534,2471,766],{"class":627},[534,2473,769],{"class":627},[534,2475,2476,2479,2481,2483,2485,2488,2490,2493],{"class":536,"line":736},[534,2477,2478],{"class":695},"      include",[534,2480,514],{"class":627},[534,2482,943],{"class":631},[534,2484,766],{"class":627},[534,2486,2487],{"class":543},"\u002Fapi\u002F**",[534,2489,766],{"class":627},[534,2491,2492],{"class":631},"]",[534,2494,716],{"class":627},[534,2496,2497,2500,2502,2504,2506,2509,2511,2513,2515,2518,2520,2522],{"class":536,"line":746},[534,2498,2499],{"class":695},"      exclude",[534,2501,514],{"class":627},[534,2503,943],{"class":631},[534,2505,766],{"class":627},[534,2507,2508],{"class":543},"\u002F_internal\u002F**",[534,2510,766],{"class":627},[534,2512,1230],{"class":627},[534,2514,641],{"class":627},[534,2516,2517],{"class":543},"\u002Fhealth",[534,2519,766],{"class":627},[534,2521,2492],{"class":631},[534,2523,716],{"class":627},[534,2525,2526,2529,2531],{"class":536,"line":772},[534,2527,2528],{"class":695},"      routes",[534,2530,514],{"class":627},[534,2532,701],{"class":627},[534,2534,2535,2538,2541,2543,2545,2547,2549,2551,2553,2556,2558],{"class":536,"line":783},[534,2536,2537],{"class":627},"        '",[534,2539,2540],{"class":695},"\u002Fapi\u002Fauth\u002F**",[534,2542,766],{"class":627},[534,2544,514],{"class":627},[534,2546,628],{"class":627},[534,2548,756],{"class":695},[534,2550,514],{"class":627},[534,2552,641],{"class":627},[534,2554,2555],{"class":543},"auth-service",[534,2557,766],{"class":627},[534,2559,769],{"class":627},[534,2561,2562,2564,2567,2569,2571,2573,2575,2577,2579,2582,2584],{"class":536,"line":791},[534,2563,2537],{"class":627},[534,2565,2566],{"class":695},"\u002Fapi\u002Fpayment\u002F**",[534,2568,766],{"class":627},[534,2570,514],{"class":627},[534,2572,628],{"class":627},[534,2574,756],{"class":695},[534,2576,514],{"class":627},[534,2578,641],{"class":627},[534,2580,2581],{"class":543},"payment-service",[534,2583,766],{"class":627},[534,2585,769],{"class":627},[534,2587,2588],{"class":536,"line":1279},[534,2589,1360],{"class":627},[534,2591,2592,2594,2596],{"class":536,"line":1323},[534,2593,775],{"class":627},[534,2595,778],{"class":631},[534,2597,716],{"class":627},[534,2599,2600,2602],{"class":536,"line":1328},[534,2601,786],{"class":631},[534,2603,716],{"class":627},[534,2605,2606,2608],{"class":536,"line":1357},[534,2607,794],{"class":627},[534,2609,797],{"class":631},[505,2611,2613],{"id":2612},"drain-enrichers","Drain & Enrichers",[433,2615,2616,2617,2620],{},"Since TanStack Start uses Nitro v3, configure drains and enrichers via Nitro plugins. Create a ",[442,2618,2619],{},"server\u002Fplugins\u002F"," directory and register hooks:",[524,2622,2625],{"className":614,"code":2623,"filename":2624,"language":616,"meta":530,"style":530},"import { definePlugin } from 'nitro'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\n\nexport default definePlugin((nitroApp) => {\n  const axiom = createAxiomDrain()\n\n  nitroApp.hooks.hook('evlog:drain', axiom)\n})\n","server\u002Fplugins\u002Fevlog-drain.ts",[442,2626,2627,2646,2666,2670,2691,2704,2708,2738],{"__ignoreMap":530},[534,2628,2629,2631,2633,2636,2638,2640,2642,2644],{"class":536,"line":537},[534,2630,624],{"class":623},[534,2632,628],{"class":627},[534,2634,2635],{"class":631}," definePlugin",[534,2637,635],{"class":627},[534,2639,638],{"class":623},[534,2641,641],{"class":627},[534,2643,644],{"class":543},[534,2645,647],{"class":627},[534,2647,2648,2650,2652,2655,2657,2659,2661,2664],{"class":536,"line":650},[534,2649,624],{"class":623},[534,2651,628],{"class":627},[534,2653,2654],{"class":631}," createAxiomDrain",[534,2656,635],{"class":627},[534,2658,638],{"class":623},[534,2660,641],{"class":627},[534,2662,2663],{"class":543},"evlog\u002Faxiom",[534,2665,647],{"class":627},[534,2667,2668],{"class":536,"line":667},[534,2669,671],{"emptyLinePlaceholder":670},[534,2671,2672,2674,2676,2678,2680,2682,2685,2687,2689],{"class":536,"line":674},[534,2673,677],{"class":623},[534,2675,680],{"class":623},[534,2677,2635],{"class":683},[534,2679,686],{"class":631},[534,2681,686],{"class":627},[534,2683,2684],{"class":1620},"nitroApp",[534,2686,778],{"class":627},[534,2688,1144],{"class":911},[534,2690,701],{"class":627},[534,2692,2693,2695,2698,2700,2702],{"class":536,"line":692},[534,2694,2143],{"class":911},[534,2696,2697],{"class":631}," axiom",[534,2699,1157],{"class":627},[534,2701,2654],{"class":683},[534,2703,1162],{"class":695},[534,2705,2706],{"class":536,"line":704},[534,2707,671],{"emptyLinePlaceholder":670},[534,2709,2710,2713,2715,2718,2720,2723,2725,2727,2730,2732,2734,2736],{"class":536,"line":719},[534,2711,2712],{"class":631},"  nitroApp",[534,2714,808],{"class":627},[534,2716,2717],{"class":631},"hooks",[534,2719,808],{"class":627},[534,2721,2722],{"class":683},"hook",[534,2724,686],{"class":695},[534,2726,766],{"class":627},[534,2728,2729],{"class":543},"evlog:drain",[534,2731,766],{"class":627},[534,2733,1230],{"class":627},[534,2735,2697],{"class":631},[534,2737,797],{"class":695},[534,2739,2740,2742],{"class":536,"line":725},[534,2741,794],{"class":627},[534,2743,797],{"class":631},[524,2745,2748],{"className":614,"code":2746,"filename":2747,"language":616,"meta":530,"style":530},"import { definePlugin } from 'nitro'\nimport { createUserAgentEnricher, createRequestSizeEnricher } from 'evlog\u002Fenrichers'\n\nexport default definePlugin((nitroApp) => {\n  const enrichers = [createUserAgentEnricher(), createRequestSizeEnricher()]\n\n  nitroApp.hooks.hook('evlog:enrich', (ctx) => {\n    for (const enricher of enrichers) enricher(ctx)\n  })\n})\n","server\u002Fplugins\u002Fevlog-enrich.ts",[442,2749,2750,2768,2793,2797,2817,2840,2844,2878,2907,2913],{"__ignoreMap":530},[534,2751,2752,2754,2756,2758,2760,2762,2764,2766],{"class":536,"line":537},[534,2753,624],{"class":623},[534,2755,628],{"class":627},[534,2757,2635],{"class":631},[534,2759,635],{"class":627},[534,2761,638],{"class":623},[534,2763,641],{"class":627},[534,2765,644],{"class":543},[534,2767,647],{"class":627},[534,2769,2770,2772,2774,2777,2779,2782,2784,2786,2788,2791],{"class":536,"line":650},[534,2771,624],{"class":623},[534,2773,628],{"class":627},[534,2775,2776],{"class":631}," createUserAgentEnricher",[534,2778,1230],{"class":627},[534,2780,2781],{"class":631}," createRequestSizeEnricher",[534,2783,635],{"class":627},[534,2785,638],{"class":623},[534,2787,641],{"class":627},[534,2789,2790],{"class":543},"evlog\u002Fenrichers",[534,2792,647],{"class":627},[534,2794,2795],{"class":536,"line":667},[534,2796,671],{"emptyLinePlaceholder":670},[534,2798,2799,2801,2803,2805,2807,2809,2811,2813,2815],{"class":536,"line":674},[534,2800,677],{"class":623},[534,2802,680],{"class":623},[534,2804,2635],{"class":683},[534,2806,686],{"class":631},[534,2808,686],{"class":627},[534,2810,2684],{"class":1620},[534,2812,778],{"class":627},[534,2814,1144],{"class":911},[534,2816,701],{"class":627},[534,2818,2819,2821,2824,2826,2828,2831,2833,2835,2837],{"class":536,"line":692},[534,2820,2143],{"class":911},[534,2822,2823],{"class":631}," enrichers",[534,2825,1157],{"class":627},[534,2827,943],{"class":695},[534,2829,2830],{"class":683},"createUserAgentEnricher",[534,2832,949],{"class":695},[534,2834,1230],{"class":627},[534,2836,2781],{"class":683},[534,2838,2839],{"class":695},"()]\n",[534,2841,2842],{"class":536,"line":704},[534,2843,671],{"emptyLinePlaceholder":670},[534,2845,2846,2848,2850,2852,2854,2856,2858,2860,2863,2865,2867,2869,2872,2874,2876],{"class":536,"line":719},[534,2847,2712],{"class":631},[534,2849,808],{"class":627},[534,2851,2717],{"class":631},[534,2853,808],{"class":627},[534,2855,2722],{"class":683},[534,2857,686],{"class":695},[534,2859,766],{"class":627},[534,2861,2862],{"class":543},"evlog:enrich",[534,2864,766],{"class":627},[534,2866,1230],{"class":627},[534,2868,1822],{"class":627},[534,2870,2871],{"class":1620},"ctx",[534,2873,778],{"class":627},[534,2875,1144],{"class":911},[534,2877,701],{"class":627},[534,2879,2880,2883,2885,2888,2891,2894,2896,2898,2901,2903,2905],{"class":536,"line":725},[534,2881,2882],{"class":623},"    for",[534,2884,1822],{"class":695},[534,2886,2887],{"class":911},"const",[534,2889,2890],{"class":631}," enricher",[534,2892,2893],{"class":627}," of",[534,2895,2823],{"class":631},[534,2897,1836],{"class":695},[534,2899,2900],{"class":683},"enricher",[534,2902,686],{"class":695},[534,2904,2871],{"class":631},[534,2906,797],{"class":695},[534,2908,2909,2911],{"class":536,"line":736},[534,2910,2222],{"class":627},[534,2912,797],{"class":695},[534,2914,2915,2917],{"class":536,"line":746},[534,2916,794],{"class":627},[534,2918,797],{"class":631},[447,2920,2344,2921,2363,2923,2925],{"color":449,"icon":13},[437,2922,325],{"href":330},[437,2924,412],{"href":417}," docs for all available drain adapters and enrichers.",[516,2927,2929],{"id":2928},"pipeline-batching-retry","Pipeline (Batching & Retry)",[433,2931,2932,2933,2936],{},"For production, wrap your adapter with ",[442,2934,2935],{},"createDrainPipeline"," to batch events and retry on failure:",[524,2938,2940],{"className":614,"code":2939,"filename":2624,"language":616,"meta":530,"style":530},"import { definePlugin } from 'nitro'\nimport type { DrainContext } from 'evlog'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\nimport { createDrainPipeline } from 'evlog\u002Fpipeline'\n\nexport default definePlugin((nitroApp) => {\n  const pipeline = createDrainPipeline\u003CDrainContext>({\n    batch: { size: 50, intervalMs: 5000 },\n    retry: { maxAttempts: 3 },\n  })\n  const drain = pipeline(createAxiomDrain())\n\n  nitroApp.hooks.hook('evlog:drain', drain)\n})\n",[442,2941,2942,2960,2981,2999,3019,3023,3043,3067,3096,3115,3121,3140,3144,3170],{"__ignoreMap":530},[534,2943,2944,2946,2948,2950,2952,2954,2956,2958],{"class":536,"line":537},[534,2945,624],{"class":623},[534,2947,628],{"class":627},[534,2949,2635],{"class":631},[534,2951,635],{"class":627},[534,2953,638],{"class":623},[534,2955,641],{"class":627},[534,2957,644],{"class":543},[534,2959,647],{"class":627},[534,2961,2962,2964,2966,2968,2971,2973,2975,2977,2979],{"class":536,"line":650},[534,2963,624],{"class":623},[534,2965,1065],{"class":623},[534,2967,628],{"class":627},[534,2969,2970],{"class":631}," DrainContext",[534,2972,635],{"class":627},[534,2974,638],{"class":623},[534,2976,641],{"class":627},[534,2978,1079],{"class":543},[534,2980,647],{"class":627},[534,2982,2983,2985,2987,2989,2991,2993,2995,2997],{"class":536,"line":667},[534,2984,624],{"class":623},[534,2986,628],{"class":627},[534,2988,2654],{"class":631},[534,2990,635],{"class":627},[534,2992,638],{"class":623},[534,2994,641],{"class":627},[534,2996,2663],{"class":543},[534,2998,647],{"class":627},[534,3000,3001,3003,3005,3008,3010,3012,3014,3017],{"class":536,"line":674},[534,3002,624],{"class":623},[534,3004,628],{"class":627},[534,3006,3007],{"class":631}," createDrainPipeline",[534,3009,635],{"class":627},[534,3011,638],{"class":623},[534,3013,641],{"class":627},[534,3015,3016],{"class":543},"evlog\u002Fpipeline",[534,3018,647],{"class":627},[534,3020,3021],{"class":536,"line":692},[534,3022,671],{"emptyLinePlaceholder":670},[534,3024,3025,3027,3029,3031,3033,3035,3037,3039,3041],{"class":536,"line":704},[534,3026,677],{"class":623},[534,3028,680],{"class":623},[534,3030,2635],{"class":683},[534,3032,686],{"class":631},[534,3034,686],{"class":627},[534,3036,2684],{"class":1620},[534,3038,778],{"class":627},[534,3040,1144],{"class":911},[534,3042,701],{"class":627},[534,3044,3045,3047,3050,3052,3054,3057,3060,3063,3065],{"class":536,"line":719},[534,3046,2143],{"class":911},[534,3048,3049],{"class":631}," pipeline",[534,3051,1157],{"class":627},[534,3053,3007],{"class":683},[534,3055,3056],{"class":627},"\u003C",[534,3058,3059],{"class":540},"DrainContext",[534,3061,3062],{"class":627},">",[534,3064,686],{"class":695},[534,3066,689],{"class":627},[534,3068,3069,3072,3074,3076,3079,3081,3084,3086,3089,3091,3094],{"class":536,"line":725},[534,3070,3071],{"class":695},"    batch",[534,3073,514],{"class":627},[534,3075,628],{"class":627},[534,3077,3078],{"class":695}," size",[534,3080,514],{"class":627},[534,3082,3083],{"class":1313}," 50",[534,3085,1230],{"class":627},[534,3087,3088],{"class":695}," intervalMs",[534,3090,514],{"class":627},[534,3092,3093],{"class":1313}," 5000",[534,3095,769],{"class":627},[534,3097,3098,3101,3103,3105,3108,3110,3113],{"class":536,"line":736},[534,3099,3100],{"class":695},"    retry",[534,3102,514],{"class":627},[534,3104,628],{"class":627},[534,3106,3107],{"class":695}," maxAttempts",[534,3109,514],{"class":627},[534,3111,3112],{"class":1313}," 3",[534,3114,769],{"class":627},[534,3116,3117,3119],{"class":536,"line":746},[534,3118,2222],{"class":627},[534,3120,797],{"class":695},[534,3122,3123,3125,3128,3130,3132,3134,3137],{"class":536,"line":772},[534,3124,2143],{"class":911},[534,3126,3127],{"class":631}," drain",[534,3129,1157],{"class":627},[534,3131,3049],{"class":683},[534,3133,686],{"class":695},[534,3135,3136],{"class":683},"createAxiomDrain",[534,3138,3139],{"class":695},"())\n",[534,3141,3142],{"class":536,"line":783},[534,3143,671],{"emptyLinePlaceholder":670},[534,3145,3146,3148,3150,3152,3154,3156,3158,3160,3162,3164,3166,3168],{"class":536,"line":791},[534,3147,2712],{"class":631},[534,3149,808],{"class":627},[534,3151,2717],{"class":631},[534,3153,808],{"class":627},[534,3155,2722],{"class":683},[534,3157,686],{"class":695},[534,3159,766],{"class":627},[534,3161,2729],{"class":543},[534,3163,766],{"class":627},[534,3165,1230],{"class":627},[534,3167,3127],{"class":631},[534,3169,797],{"class":695},[534,3171,3172,3174],{"class":536,"line":1279},[534,3173,794],{"class":627},[534,3175,797],{"class":631},[447,3177,3178,3179,3182,3183,3186],{"color":449,"icon":13},"Call ",[442,3180,3181],{},"drain.flush()"," on server shutdown to ensure all buffered events are sent. See the ",[437,3184,3185],{"href":394},"Pipeline docs"," for all options.",[505,3188,3190],{"id":3189},"tail-sampling","Tail Sampling",[433,3192,3193,3194,3197],{},"Use the ",[442,3195,3196],{},"evlog:emit:keep"," hook to force-retain specific events regardless of head sampling:",[524,3199,3202],{"className":614,"code":3200,"filename":3201,"language":616,"meta":530,"style":530},"import { definePlugin } from 'nitro'\n\nexport default definePlugin((nitroApp) => {\n  nitroApp.hooks.hook('evlog:emit:keep', (ctx) => {\n    if (ctx.duration && ctx.duration > 2000) ctx.shouldKeep = true\n    if (ctx.status && ctx.status >= 500) ctx.shouldKeep = true\n  })\n})\n","server\u002Fplugins\u002Fevlog-keep.ts",[442,3203,3204,3222,3226,3246,3278,3322,3360,3366],{"__ignoreMap":530},[534,3205,3206,3208,3210,3212,3214,3216,3218,3220],{"class":536,"line":537},[534,3207,624],{"class":623},[534,3209,628],{"class":627},[534,3211,2635],{"class":631},[534,3213,635],{"class":627},[534,3215,638],{"class":623},[534,3217,641],{"class":627},[534,3219,644],{"class":543},[534,3221,647],{"class":627},[534,3223,3224],{"class":536,"line":650},[534,3225,671],{"emptyLinePlaceholder":670},[534,3227,3228,3230,3232,3234,3236,3238,3240,3242,3244],{"class":536,"line":667},[534,3229,677],{"class":623},[534,3231,680],{"class":623},[534,3233,2635],{"class":683},[534,3235,686],{"class":631},[534,3237,686],{"class":627},[534,3239,2684],{"class":1620},[534,3241,778],{"class":627},[534,3243,1144],{"class":911},[534,3245,701],{"class":627},[534,3247,3248,3250,3252,3254,3256,3258,3260,3262,3264,3266,3268,3270,3272,3274,3276],{"class":536,"line":674},[534,3249,2712],{"class":631},[534,3251,808],{"class":627},[534,3253,2717],{"class":631},[534,3255,808],{"class":627},[534,3257,2722],{"class":683},[534,3259,686],{"class":695},[534,3261,766],{"class":627},[534,3263,3196],{"class":543},[534,3265,766],{"class":627},[534,3267,1230],{"class":627},[534,3269,1822],{"class":627},[534,3271,2871],{"class":1620},[534,3273,778],{"class":627},[534,3275,1144],{"class":911},[534,3277,701],{"class":627},[534,3279,3280,3283,3285,3287,3289,3292,3295,3298,3300,3302,3305,3308,3310,3312,3314,3317,3319],{"class":536,"line":692},[534,3281,3282],{"class":623},"    if",[534,3284,1822],{"class":695},[534,3286,2871],{"class":631},[534,3288,808],{"class":627},[534,3290,3291],{"class":631},"duration",[534,3293,3294],{"class":627}," &&",[534,3296,3297],{"class":631}," ctx",[534,3299,808],{"class":627},[534,3301,3291],{"class":631},[534,3303,3304],{"class":627}," >",[534,3306,3307],{"class":1313}," 2000",[534,3309,1836],{"class":695},[534,3311,2871],{"class":631},[534,3313,808],{"class":627},[534,3315,3316],{"class":631},"shouldKeep",[534,3318,1157],{"class":627},[534,3320,3321],{"class":712}," true\n",[534,3323,3324,3326,3328,3330,3332,3334,3336,3338,3340,3342,3345,3348,3350,3352,3354,3356,3358],{"class":536,"line":704},[534,3325,3282],{"class":623},[534,3327,1822],{"class":695},[534,3329,2871],{"class":631},[534,3331,808],{"class":627},[534,3333,2277],{"class":631},[534,3335,3294],{"class":627},[534,3337,3297],{"class":631},[534,3339,808],{"class":627},[534,3341,2277],{"class":631},[534,3343,3344],{"class":627}," >=",[534,3346,3347],{"class":1313}," 500",[534,3349,1836],{"class":695},[534,3351,2871],{"class":631},[534,3353,808],{"class":627},[534,3355,3316],{"class":631},[534,3357,1157],{"class":627},[534,3359,3321],{"class":712},[534,3361,3362,3364],{"class":536,"line":719},[534,3363,2222],{"class":627},[534,3365,797],{"class":695},[534,3367,3368,3370],{"class":536,"line":725},[534,3369,794],{"class":627},[534,3371,797],{"class":631},[505,3373,3375],{"id":3374},"run-locally","Run Locally",[524,3377,3380],{"className":526,"code":3378,"filename":3379,"language":529,"meta":530,"style":530},"git clone https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog.git\ncd evlog\u002Fexamples\u002Ftanstack-start\npnpm install\npnpm run dev\n","Terminal",[442,3381,3382,3393,3401,3408],{"__ignoreMap":530},[534,3383,3384,3387,3390],{"class":536,"line":537},[534,3385,3386],{"class":540},"git",[534,3388,3389],{"class":543}," clone",[534,3391,3392],{"class":543}," https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog.git\n",[534,3394,3395,3398],{"class":536,"line":650},[534,3396,3397],{"class":683},"cd",[534,3399,3400],{"class":543}," evlog\u002Fexamples\u002Ftanstack-start\n",[534,3402,3403,3405],{"class":536,"line":667},[534,3404,528],{"class":540},[534,3406,3407],{"class":543}," install\n",[534,3409,3410,3412,3415],{"class":536,"line":674},[534,3411,528],{"class":540},[534,3413,3414],{"class":543}," run",[534,3416,3417],{"class":543}," dev\n",[433,3419,3420,3421,3425],{},"Open ",[437,3422,3423],{"href":3423,"rel":3424},"http:\u002F\u002Flocalhost:3000",[498]," and navigate to the evlog Demo page to test the API endpoints.",[3427,3428,3429],"card-group",{},[3430,3431,3435],"card",{"icon":3432,"title":3433,"to":3434},"i-simple-icons-github","Source Code","https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog\u002Ftree\u002Fmain\u002Fexamples\u002Ftanstack-start","Browse the complete TanStack Start example source on GitHub.",[505,3437,3439],{"id":3438},"next-steps","Next Steps",[433,3441,3442,3443,3445],{},"Deepen your ",[451,3444,231],{}," integration:",[470,3447,3448,3453,3458,3463],{},[473,3449,3450,3452],{},[437,3451,51],{"href":52},": Design comprehensive events with context layering",[473,3454,3455,3457],{},[437,3456,325],{"href":330},": Send logs to Axiom, Sentry, PostHog, and more",[473,3459,3460,3462],{},[437,3461,175],{"href":176},": Control log volume with head and tail sampling",[473,3464,3465,3467,3468,823,3470,827,3472,3474],{},[437,3466,56],{"href":57},": Throw errors with ",[442,3469,822],{},[442,3471,826],{},[442,3473,830],{}," fields",[3476,3477,3478],"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 .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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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":530,"searchDepth":650,"depth":650,"links":3480},[3481,3487,3488,3491,3492,3493,3496,3497,3498],{"id":507,"depth":650,"text":20,"children":3482},[3483,3484,3486],{"id":518,"depth":667,"text":519},{"id":593,"depth":667,"text":3485},"2. Add nitro.config.ts",{"id":811,"depth":667,"text":812},{"id":1000,"depth":650,"text":51},{"id":1464,"depth":650,"text":1465,"children":3489},[3490],{"id":2093,"depth":667,"text":2094},{"id":2341,"depth":650,"text":170},{"id":2355,"depth":650,"text":2356},{"id":2612,"depth":650,"text":2613,"children":3494},[3495],{"id":2928,"depth":667,"text":2929},{"id":3189,"depth":650,"text":3190},{"id":3374,"depth":650,"text":3375},{"id":3438,"depth":650,"text":3439},"Automatic wide events, structured errors, and logging in TanStack Start API routes and server functions.","md",[3502],{"label":3433,"icon":3432,"to":3434,"color":3503,"variant":3504},"neutral","subtle",{},{"title":231,"icon":234},{"title":231,"description":3499},"oJOskYsSRKvPObr6ZzqpBK-BEAKQjfIsAnPBY_eHeQE",[3510,3512],{"title":226,"path":227,"stem":228,"description":3511,"icon":229,"children":-1},"Automatic wide events, structured errors, drain adapters, enrichers, and tail sampling in Nitro v2 and v3 applications.",{"title":236,"path":237,"stem":238,"description":3513,"icon":239,"children":-1},"Automatic wide events, structured errors, drain adapters, enrichers, and tail sampling in NestJS applications.",1778346894669]