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