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