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