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