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