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