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