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