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