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