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