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