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