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