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