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