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