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