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