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