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