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