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