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