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