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