[{"data":1,"prerenderedAt":3558},["ShallowReactive",2],{"navigation_docs":3,"-integrate-frameworks-react-router":534,"-integrate-frameworks-react-router-surround":3553},[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":3543,"extension":3544,"links":3545,"meta":3549,"navigation":3550,"path":281,"seo":3551,"stem":282,"__hash__":3552},"docs\u002F4.integrate\u002Fframeworks\u002F11.react-router.md",{"type":537,"value":538,"toc":3522},"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,2128,2342,2346,2363,2600,2603,2669,2672,2682,2686,2689,2876,2880,2887,3098,3109,3113,3119,3243,3247,3257,3421,3425,3467,3475,3485,3489,3518],[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,1026],{},"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","Wide events — After emit",[663,2129,2132],{"className":763,"code":2130,"filename":2131,"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,2133,2134,2152,2170,2191,2195,2223,2243,2274,2288,2317,2324,2338],{"__ignoreMap":669},[673,2135,2136,2138,2140,2142,2144,2146,2148,2150],{"class":675,"line":676},[673,2137,774],{"class":773},[673,2139,781],{"class":780},[673,2141,1244],{"class":784},[673,2143,788],{"class":780},[673,2145,791],{"class":773},[673,2147,794],{"class":780},[673,2149,546],{"class":682},[673,2151,800],{"class":780},[673,2153,2154,2156,2158,2160,2162,2164,2166,2168],{"class":675,"line":803},[673,2155,774],{"class":773},[673,2157,781],{"class":780},[673,2159,1807],{"class":784},[673,2161,788],{"class":780},[673,2163,791],{"class":773},[673,2165,794],{"class":780},[673,2167,546],{"class":682},[673,2169,800],{"class":780},[673,2171,2172,2174,2176,2178,2180,2182,2184,2186,2189],{"class":675,"line":810},[673,2173,774],{"class":773},[673,2175,777],{"class":773},[673,2177,781],{"class":780},[673,2179,1023],{"class":784},[673,2181,788],{"class":780},[673,2183,791],{"class":773},[673,2185,794],{"class":780},[673,2187,2188],{"class":682},".\u002F+types\u002Forders",[673,2190,800],{"class":780},[673,2192,2193],{"class":675,"line":822},[673,2194,807],{"emptyLinePlaceholder":806},[673,2196,2197,2199,2201,2203,2206,2208,2210,2212,2214,2216,2219,2221],{"class":675,"line":834},[673,2198,813],{"class":773},[673,2200,1265],{"class":1014},[673,2202,1070],{"class":1014},[673,2204,2205],{"class":962}," action",[673,2207,1273],{"class":780},[673,2209,1277],{"class":1276},[673,2211,1280],{"class":780},[673,2213,1023],{"class":679},[673,2215,1026],{"class":780},[673,2217,2218],{"class":679},"ActionArgs",[673,2220,1290],{"class":780},[673,2222,819],{"class":780},[673,2224,2225,2227,2229,2231,2233,2235,2237,2239,2241],{"class":675,"line":849},[673,2226,1297],{"class":1014},[673,2228,1300],{"class":784},[673,2230,1303],{"class":780},[673,2232,1277],{"class":784},[673,2234,1026],{"class":780},[673,2236,1310],{"class":962},[673,2238,966],{"class":825},[673,2240,1315],{"class":784},[673,2242,1001],{"class":825},[673,2244,2245,2247,2249,2251,2253,2255,2257,2260,2262,2264,2266,2269,2272],{"class":675,"line":855},[673,2246,1322],{"class":784},[673,2248,1026],{"class":780},[673,2250,2122],{"class":962},[673,2252,2090],{"class":780},[673,2254,966],{"class":825},[673,2256,991],{"class":780},[673,2258,2259],{"class":682},"background",[673,2261,991],{"class":780},[673,2263,886],{"class":780},[673,2265,1265],{"class":1014},[673,2267,2268],{"class":780}," ()",[673,2270,2271],{"class":1014}," =>",[673,2273,819],{"class":780},[673,2275,2276,2279,2282,2284,2286],{"class":675,"line":1004},[673,2277,2278],{"class":1014},"    const",[673,2280,2281],{"class":784}," child",[673,2283,1303],{"class":780},[673,2285,1807],{"class":962},[673,2287,1858],{"class":825},[673,2289,2290,2293,2295,2297,2299,2301,2304,2306,2308,2311,2313,2315],{"class":675,"line":1009},[673,2291,2292],{"class":784},"    child",[673,2294,1026],{"class":780},[673,2296,1327],{"class":962},[673,2298,966],{"class":825},[673,2300,1332],{"class":780},[673,2302,2303],{"class":825}," step",[673,2305,829],{"class":780},[673,2307,794],{"class":780},[673,2309,2310],{"class":682},"complete",[673,2312,991],{"class":780},[673,2314,788],{"class":780},[673,2316,1001],{"class":825},[673,2318,2319,2322],{"class":675,"line":1041},[673,2320,2321],{"class":780},"  }",[673,2323,1001],{"class":825},[673,2325,2326,2328,2330,2332,2334,2336],{"class":675,"line":1052},[673,2327,1083],{"class":773},[673,2329,781],{"class":780},[673,2331,1357],{"class":825},[673,2333,829],{"class":780},[673,2335,843],{"class":842},[673,2337,1364],{"class":780},[673,2339,2340],{"class":675,"line":1058},[673,2341,1225],{"class":780},[651,2343,2345],{"id":2344},"error-handling","Error Handling",[540,2347,2348,2349,2352,2353,573,2356,577,2359,2362],{},"Use ",[544,2350,2351],{},"createError"," for structured errors with ",[544,2354,2355],{},"why",[544,2357,2358],{},"fix",[544,2360,2361],{},"link"," fields:",[663,2364,2367],{"className":763,"code":2365,"filename":2366,"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,2368,2369,2387,2406,2410,2436,2456,2499,2503,2514,2530,2542,2558,2574,2590,2596],{"__ignoreMap":669},[673,2370,2371,2373,2375,2377,2379,2381,2383,2385],{"class":675,"line":676},[673,2372,774],{"class":773},[673,2374,781],{"class":780},[673,2376,1244],{"class":784},[673,2378,788],{"class":780},[673,2380,791],{"class":773},[673,2382,794],{"class":780},[673,2384,546],{"class":682},[673,2386,800],{"class":780},[673,2388,2389,2391,2393,2396,2398,2400,2402,2404],{"class":675,"line":803},[673,2390,774],{"class":773},[673,2392,781],{"class":780},[673,2394,2395],{"class":784}," createError",[673,2397,788],{"class":780},[673,2399,791],{"class":773},[673,2401,794],{"class":780},[673,2403,933],{"class":682},[673,2405,800],{"class":780},[673,2407,2408],{"class":675,"line":810},[673,2409,807],{"emptyLinePlaceholder":806},[673,2411,2412,2414,2416,2418,2420,2422,2424,2426,2428,2430,2432,2434],{"class":675,"line":822},[673,2413,813],{"class":773},[673,2415,1265],{"class":1014},[673,2417,1070],{"class":1014},[673,2419,1270],{"class":962},[673,2421,1273],{"class":780},[673,2423,1277],{"class":1276},[673,2425,1280],{"class":780},[673,2427,1023],{"class":679},[673,2429,1026],{"class":780},[673,2431,1287],{"class":679},[673,2433,1290],{"class":780},[673,2435,819],{"class":780},[673,2437,2438,2440,2442,2444,2446,2448,2450,2452,2454],{"class":675,"line":834},[673,2439,1297],{"class":1014},[673,2441,1300],{"class":784},[673,2443,1303],{"class":780},[673,2445,1277],{"class":784},[673,2447,1026],{"class":780},[673,2449,1310],{"class":962},[673,2451,966],{"class":825},[673,2453,1315],{"class":784},[673,2455,1001],{"class":825},[673,2457,2458,2460,2462,2464,2466,2468,2471,2473,2475,2478,2480,2483,2485,2488,2490,2493,2495,2497],{"class":675,"line":849},[673,2459,1322],{"class":784},[673,2461,1026],{"class":780},[673,2463,1327],{"class":962},[673,2465,966],{"class":825},[673,2467,1332],{"class":780},[673,2469,2470],{"class":825}," cart",[673,2472,829],{"class":780},[673,2474,781],{"class":780},[673,2476,2477],{"class":825}," items",[673,2479,829],{"class":780},[673,2481,2482],{"class":1752}," 3",[673,2484,886],{"class":780},[673,2486,2487],{"class":825}," total",[673,2489,829],{"class":780},[673,2491,2492],{"class":1752}," 9999",[673,2494,788],{"class":780},[673,2496,788],{"class":780},[673,2498,1001],{"class":825},[673,2500,2501],{"class":675,"line":855},[673,2502,807],{"emptyLinePlaceholder":806},[673,2504,2505,2508,2510,2512],{"class":675,"line":1004},[673,2506,2507],{"class":773},"  throw",[673,2509,2395],{"class":962},[673,2511,966],{"class":825},[673,2513,969],{"class":780},[673,2515,2516,2519,2521,2523,2526,2528],{"class":675,"line":1009},[673,2517,2518],{"class":825},"    message",[673,2520,829],{"class":780},[673,2522,794],{"class":780},[673,2524,2525],{"class":682},"Payment failed",[673,2527,991],{"class":780},[673,2529,846],{"class":780},[673,2531,2532,2535,2537,2540],{"class":675,"line":1041},[673,2533,2534],{"class":825},"    status",[673,2536,829],{"class":780},[673,2538,2539],{"class":1752}," 402",[673,2541,846],{"class":780},[673,2543,2544,2547,2549,2551,2554,2556],{"class":675,"line":1052},[673,2545,2546],{"class":825},"    why",[673,2548,829],{"class":780},[673,2550,794],{"class":780},[673,2552,2553],{"class":682},"Card declined by issuer",[673,2555,991],{"class":780},[673,2557,846],{"class":780},[673,2559,2560,2563,2565,2567,2570,2572],{"class":675,"line":1058},[673,2561,2562],{"class":825},"    fix",[673,2564,829],{"class":780},[673,2566,794],{"class":780},[673,2568,2569],{"class":682},"Try a different payment method",[673,2571,991],{"class":780},[673,2573,846],{"class":780},[673,2575,2576,2579,2581,2583,2586,2588],{"class":675,"line":1063},[673,2577,2578],{"class":825},"    link",[673,2580,829],{"class":780},[673,2582,794],{"class":780},[673,2584,2585],{"class":682},"https:\u002F\u002Fdocs.example.com\u002Fpayments\u002Fdeclined",[673,2587,991],{"class":780},[673,2589,846],{"class":780},[673,2591,2592,2594],{"class":675,"line":1080},[673,2593,2321],{"class":780},[673,2595,1001],{"class":825},[673,2597,2598],{"class":675,"line":1089},[673,2599,1225],{"class":780},[540,2601,2602],{},"The error is captured and logged with both the custom context and structured error fields:",[663,2604,2606],{"className":665,"code":2605,"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,2607,2608,2619,2641,2660],{"__ignoreMap":669},[673,2609,2610,2613,2616],{"class":675,"line":676},[673,2611,2612],{"class":679},"14:58:20",[673,2614,2615],{"class":682}," ERROR",[673,2617,2618],{"class":784}," [my-api] GET \u002Fcheckout 402 in 3ms\n",[673,2620,2621,2623,2626,2629,2632,2635,2638],{"class":675,"line":803},[673,2622,1743],{"class":679},[673,2624,2625],{"class":682}," error:",[673,2627,2628],{"class":682}," name=EvlogError",[673,2630,2631],{"class":682}," message=Payment",[673,2633,2634],{"class":682}," failed",[673,2636,2637],{"class":682}," status=",[673,2639,2640],{"class":1752},"402\n",[673,2642,2643,2645,2648,2651,2654,2657],{"class":675,"line":810},[673,2644,1743],{"class":679},[673,2646,2647],{"class":682}," cart:",[673,2649,2650],{"class":682}," items=",[673,2652,2653],{"class":1752},"3",[673,2655,2656],{"class":682}," total=",[673,2658,2659],{"class":1752},"9999\n",[673,2661,2662,2664,2666],{"class":675,"line":822},[673,2663,1780],{"class":679},[673,2665,1783],{"class":682},[673,2667,2668],{"class":682}," 880a50ac-...\n",[651,2670,504],{"id":2671},"configuration",[540,2673,2674,2675,2678,2679,2681],{},"See the ",[562,2676,2677],{"href":505},"Configuration reference"," for all available options (",[544,2680,963],{},", middleware options, sampling, silent mode, etc.).",[651,2683,2685],{"id":2684},"drain-enrichers","Drain & Enrichers",[540,2687,2688],{},"Configure drain adapters and enrichers directly in the middleware options:",[663,2690,2692],{"className":763,"code":2691,"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,2693,2694,2714,2734,2738,2752,2756,2778,2786,2799,2818,2829,2859,2864,2872],{"__ignoreMap":669},[673,2695,2696,2698,2700,2703,2705,2707,2709,2712],{"class":675,"line":676},[673,2697,774],{"class":773},[673,2699,781],{"class":780},[673,2701,2702],{"class":784}," createAxiomDrain",[673,2704,788],{"class":780},[673,2706,791],{"class":773},[673,2708,794],{"class":780},[673,2710,2711],{"class":682},"evlog\u002Faxiom",[673,2713,800],{"class":780},[673,2715,2716,2718,2720,2723,2725,2727,2729,2732],{"class":675,"line":803},[673,2717,774],{"class":773},[673,2719,781],{"class":780},[673,2721,2722],{"class":784}," createUserAgentEnricher",[673,2724,788],{"class":780},[673,2726,791],{"class":773},[673,2728,794],{"class":780},[673,2730,2731],{"class":682},"evlog\u002Fenrichers",[673,2733,800],{"class":780},[673,2735,2736],{"class":675,"line":810},[673,2737,807],{"emptyLinePlaceholder":806},[673,2739,2740,2743,2746,2748,2750],{"class":675,"line":822},[673,2741,2742],{"class":1014},"const",[673,2744,2745],{"class":784}," userAgent ",[673,2747,1035],{"class":780},[673,2749,2722],{"class":962},[673,2751,1858],{"class":784},[673,2753,2754],{"class":675,"line":834},[673,2755,807],{"emptyLinePlaceholder":806},[673,2757,2758,2760,2762,2764,2766,2768,2770,2772,2774,2776],{"class":675,"line":849},[673,2759,813],{"class":773},[673,2761,1015],{"class":1014},[673,2763,1018],{"class":784},[673,2765,829],{"class":780},[673,2767,1023],{"class":679},[673,2769,1026],{"class":780},[673,2771,1029],{"class":679},[673,2773,1032],{"class":784},[673,2775,1035],{"class":780},[673,2777,1038],{"class":784},[673,2779,2780,2782,2784],{"class":675,"line":855},[673,2781,1044],{"class":962},[673,2783,966],{"class":784},[673,2785,969],{"class":780},[673,2787,2788,2791,2793,2795,2797],{"class":675,"line":1004},[673,2789,2790],{"class":825},"    drain",[673,2792,829],{"class":780},[673,2794,2702],{"class":962},[673,2796,1047],{"class":784},[673,2798,846],{"class":780},[673,2800,2801,2804,2806,2809,2812,2814,2816],{"class":675,"line":1009},[673,2802,2803],{"class":962},"    enrich",[673,2805,829],{"class":780},[673,2807,2808],{"class":780}," (",[673,2810,2811],{"class":1276},"ctx",[673,2813,1290],{"class":780},[673,2815,2271],{"class":1014},[673,2817,819],{"class":780},[673,2819,2820,2823,2825,2827],{"class":675,"line":1041},[673,2821,2822],{"class":962},"      userAgent",[673,2824,966],{"class":825},[673,2826,2811],{"class":784},[673,2828,1001],{"class":825},[673,2830,2831,2834,2836,2839,2841,2844,2846,2849,2851,2854,2856],{"class":675,"line":1052},[673,2832,2833],{"class":784},"      ctx",[673,2835,1026],{"class":780},[673,2837,2838],{"class":784},"event",[673,2840,1026],{"class":780},[673,2842,2843],{"class":784},"region",[673,2845,1303],{"class":780},[673,2847,2848],{"class":784}," process",[673,2850,1026],{"class":780},[673,2852,2853],{"class":784},"env",[673,2855,1026],{"class":780},[673,2857,2858],{"class":784},"FLY_REGION\n",[673,2860,2861],{"class":675,"line":1058},[673,2862,2863],{"class":780},"    },\n",[673,2865,2866,2868,2870],{"class":675,"line":1063},[673,2867,2321],{"class":780},[673,2869,1290],{"class":784},[673,2871,846],{"class":780},[673,2873,2874],{"class":675,"line":1080},[673,2875,1055],{"class":784},[655,2877,2879],{"id":2878},"pipeline-batching-retry","Pipeline (Batching & Retry)",[540,2881,2882,2883,2886],{},"For production, wrap your adapter with ",[544,2884,2885],{},"createDrainPipeline"," to batch events and retry on failure:",[663,2888,2890],{"className":763,"code":2889,"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,2891,2892,2913,2931,2951,2955,2979,3008,3026,3032,3052,3056,3078,3094],{"__ignoreMap":669},[673,2893,2894,2896,2898,2900,2903,2905,2907,2909,2911],{"class":675,"line":676},[673,2895,774],{"class":773},[673,2897,777],{"class":773},[673,2899,781],{"class":780},[673,2901,2902],{"class":784}," DrainContext",[673,2904,788],{"class":780},[673,2906,791],{"class":773},[673,2908,794],{"class":780},[673,2910,933],{"class":682},[673,2912,800],{"class":780},[673,2914,2915,2917,2919,2921,2923,2925,2927,2929],{"class":675,"line":803},[673,2916,774],{"class":773},[673,2918,781],{"class":780},[673,2920,2702],{"class":784},[673,2922,788],{"class":780},[673,2924,791],{"class":773},[673,2926,794],{"class":780},[673,2928,2711],{"class":682},[673,2930,800],{"class":780},[673,2932,2933,2935,2937,2940,2942,2944,2946,2949],{"class":675,"line":810},[673,2934,774],{"class":773},[673,2936,781],{"class":780},[673,2938,2939],{"class":784}," createDrainPipeline",[673,2941,788],{"class":780},[673,2943,791],{"class":773},[673,2945,794],{"class":780},[673,2947,2948],{"class":682},"evlog\u002Fpipeline",[673,2950,800],{"class":780},[673,2952,2953],{"class":675,"line":822},[673,2954,807],{"emptyLinePlaceholder":806},[673,2956,2957,2959,2962,2964,2966,2969,2972,2975,2977],{"class":675,"line":834},[673,2958,2742],{"class":1014},[673,2960,2961],{"class":784}," pipeline ",[673,2963,1035],{"class":780},[673,2965,2939],{"class":962},[673,2967,2968],{"class":780},"\u003C",[673,2970,2971],{"class":679},"DrainContext",[673,2973,2974],{"class":780},">",[673,2976,966],{"class":784},[673,2978,969],{"class":780},[673,2980,2981,2984,2986,2988,2991,2993,2996,2998,3001,3003,3006],{"class":675,"line":849},[673,2982,2983],{"class":825},"  batch",[673,2985,829],{"class":780},[673,2987,781],{"class":780},[673,2989,2990],{"class":825}," size",[673,2992,829],{"class":780},[673,2994,2995],{"class":1752}," 50",[673,2997,886],{"class":780},[673,2999,3000],{"class":825}," intervalMs",[673,3002,829],{"class":780},[673,3004,3005],{"class":1752}," 5000",[673,3007,994],{"class":780},[673,3009,3010,3013,3015,3017,3020,3022,3024],{"class":675,"line":855},[673,3011,3012],{"class":825},"  retry",[673,3014,829],{"class":780},[673,3016,781],{"class":780},[673,3018,3019],{"class":825}," maxAttempts",[673,3021,829],{"class":780},[673,3023,2482],{"class":1752},[673,3025,994],{"class":780},[673,3027,3028,3030],{"class":675,"line":1004},[673,3029,858],{"class":780},[673,3031,1001],{"class":784},[673,3033,3034,3036,3039,3041,3044,3046,3049],{"class":675,"line":1009},[673,3035,2742],{"class":1014},[673,3037,3038],{"class":784}," drain ",[673,3040,1035],{"class":780},[673,3042,3043],{"class":962}," pipeline",[673,3045,966],{"class":784},[673,3047,3048],{"class":962},"createAxiomDrain",[673,3050,3051],{"class":784},"())\n",[673,3053,3054],{"class":675,"line":1041},[673,3055,807],{"emptyLinePlaceholder":806},[673,3057,3058,3060,3062,3064,3066,3068,3070,3072,3074,3076],{"class":675,"line":1052},[673,3059,813],{"class":773},[673,3061,1015],{"class":1014},[673,3063,1018],{"class":784},[673,3065,829],{"class":780},[673,3067,1023],{"class":679},[673,3069,1026],{"class":780},[673,3071,1029],{"class":679},[673,3073,1032],{"class":784},[673,3075,1035],{"class":780},[673,3077,1038],{"class":784},[673,3079,3080,3082,3084,3086,3088,3090,3092],{"class":675,"line":1058},[673,3081,1044],{"class":962},[673,3083,966],{"class":784},[673,3085,1332],{"class":780},[673,3087,3038],{"class":784},[673,3089,858],{"class":780},[673,3091,1290],{"class":784},[673,3093,846],{"class":780},[673,3095,3096],{"class":675,"line":1063},[673,3097,1055],{"class":784},[557,3099,3100,3101,3104,3105,3108],{"color":559,"icon":13},"Call ",[544,3102,3103],{},"drain.flush()"," on server shutdown to ensure all buffered events are sent. See the ",[562,3106,3107],{"href":496},"Pipeline docs"," for all options.",[651,3110,3112],{"id":3111},"tail-sampling","Tail Sampling",[540,3114,2348,3115,3118],{},[544,3116,3117],{},"keep"," to force-retain specific events regardless of head sampling:",[663,3120,3122],{"className":763,"code":3121,"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,3123,3124,3146,3154,3166,3183,3227,3231,3239],{"__ignoreMap":669},[673,3125,3126,3128,3130,3132,3134,3136,3138,3140,3142,3144],{"class":675,"line":676},[673,3127,813],{"class":773},[673,3129,1015],{"class":1014},[673,3131,1018],{"class":784},[673,3133,829],{"class":780},[673,3135,1023],{"class":679},[673,3137,1026],{"class":780},[673,3139,1029],{"class":679},[673,3141,1032],{"class":784},[673,3143,1035],{"class":780},[673,3145,1038],{"class":784},[673,3147,3148,3150,3152],{"class":675,"line":803},[673,3149,1044],{"class":962},[673,3151,966],{"class":784},[673,3153,969],{"class":780},[673,3155,3156,3158,3160,3162,3164],{"class":675,"line":810},[673,3157,2790],{"class":825},[673,3159,829],{"class":780},[673,3161,2702],{"class":962},[673,3163,1047],{"class":784},[673,3165,846],{"class":780},[673,3167,3168,3171,3173,3175,3177,3179,3181],{"class":675,"line":822},[673,3169,3170],{"class":962},"    keep",[673,3172,829],{"class":780},[673,3174,2808],{"class":780},[673,3176,2811],{"class":1276},[673,3178,1290],{"class":780},[673,3180,2271],{"class":1014},[673,3182,819],{"class":780},[673,3184,3185,3188,3190,3192,3194,3197,3200,3203,3205,3207,3210,3213,3215,3217,3219,3222,3224],{"class":675,"line":834},[673,3186,3187],{"class":773},"      if",[673,3189,2808],{"class":825},[673,3191,2811],{"class":784},[673,3193,1026],{"class":780},[673,3195,3196],{"class":784},"duration",[673,3198,3199],{"class":780}," &&",[673,3201,3202],{"class":784}," ctx",[673,3204,1026],{"class":780},[673,3206,3196],{"class":784},[673,3208,3209],{"class":780}," >",[673,3211,3212],{"class":1752}," 2000",[673,3214,1690],{"class":825},[673,3216,2811],{"class":784},[673,3218,1026],{"class":780},[673,3220,3221],{"class":784},"shouldKeep",[673,3223,1303],{"class":780},[673,3225,3226],{"class":842}," true\n",[673,3228,3229],{"class":675,"line":849},[673,3230,2863],{"class":780},[673,3232,3233,3235,3237],{"class":675,"line":855},[673,3234,2321],{"class":780},[673,3236,1290],{"class":784},[673,3238,846],{"class":780},[673,3240,3241],{"class":675,"line":1004},[673,3242,1055],{"class":784},[651,3244,3246],{"id":3245},"route-filtering","Route Filtering",[540,3248,3249,3250,587,3253,3256],{},"Control which routes are logged with ",[544,3251,3252],{},"include",[544,3254,3255],{},"exclude"," patterns:",[663,3258,3260],{"className":763,"code":3259,"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,3261,3262,3284,3292,3314,3343,3352,3379,3405,3409,3417],{"__ignoreMap":669},[673,3263,3264,3266,3268,3270,3272,3274,3276,3278,3280,3282],{"class":675,"line":676},[673,3265,813],{"class":773},[673,3267,1015],{"class":1014},[673,3269,1018],{"class":784},[673,3271,829],{"class":780},[673,3273,1023],{"class":679},[673,3275,1026],{"class":780},[673,3277,1029],{"class":679},[673,3279,1032],{"class":784},[673,3281,1035],{"class":780},[673,3283,1038],{"class":784},[673,3285,3286,3288,3290],{"class":675,"line":803},[673,3287,1044],{"class":962},[673,3289,966],{"class":784},[673,3291,969],{"class":780},[673,3293,3294,3297,3299,3302,3304,3307,3309,3312],{"class":675,"line":810},[673,3295,3296],{"class":825},"    include",[673,3298,829],{"class":780},[673,3300,3301],{"class":784}," [",[673,3303,991],{"class":780},[673,3305,3306],{"class":682},"\u002Fapi\u002F**",[673,3308,991],{"class":780},[673,3310,3311],{"class":784},"]",[673,3313,846],{"class":780},[673,3315,3316,3319,3321,3323,3325,3328,3330,3332,3334,3337,3339,3341],{"class":675,"line":822},[673,3317,3318],{"class":825},"    exclude",[673,3320,829],{"class":780},[673,3322,3301],{"class":784},[673,3324,991],{"class":780},[673,3326,3327],{"class":682},"\u002F_internal\u002F**",[673,3329,991],{"class":780},[673,3331,886],{"class":780},[673,3333,794],{"class":780},[673,3335,3336],{"class":682},"\u002Fhealth",[673,3338,991],{"class":780},[673,3340,3311],{"class":784},[673,3342,846],{"class":780},[673,3344,3345,3348,3350],{"class":675,"line":834},[673,3346,3347],{"class":825},"    routes",[673,3349,829],{"class":780},[673,3351,819],{"class":780},[673,3353,3354,3357,3360,3362,3364,3366,3368,3370,3372,3375,3377],{"class":675,"line":849},[673,3355,3356],{"class":780},"      '",[673,3358,3359],{"class":825},"\u002Fapi\u002Fauth\u002F**",[673,3361,991],{"class":780},[673,3363,829],{"class":780},[673,3365,781],{"class":780},[673,3367,981],{"class":825},[673,3369,829],{"class":780},[673,3371,794],{"class":780},[673,3373,3374],{"class":682},"auth-service",[673,3376,991],{"class":780},[673,3378,994],{"class":780},[673,3380,3381,3383,3386,3388,3390,3392,3394,3396,3398,3401,3403],{"class":675,"line":855},[673,3382,3356],{"class":780},[673,3384,3385],{"class":825},"\u002Fapi\u002Fpayment\u002F**",[673,3387,991],{"class":780},[673,3389,829],{"class":780},[673,3391,781],{"class":780},[673,3393,981],{"class":825},[673,3395,829],{"class":780},[673,3397,794],{"class":780},[673,3399,3400],{"class":682},"payment-service",[673,3402,991],{"class":780},[673,3404,994],{"class":780},[673,3406,3407],{"class":675,"line":1004},[673,3408,2863],{"class":780},[673,3410,3411,3413,3415],{"class":675,"line":1009},[673,3412,2321],{"class":780},[673,3414,1290],{"class":784},[673,3416,846],{"class":780},[673,3418,3419],{"class":675,"line":1041},[673,3420,1055],{"class":784},[651,3422,3424],{"id":3423},"run-locally","Run Locally",[663,3426,3429],{"className":665,"code":3427,"filename":3428,"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,3430,3431,3442,3450,3457],{"__ignoreMap":669},[673,3432,3433,3436,3439],{"class":675,"line":676},[673,3434,3435],{"class":679},"git",[673,3437,3438],{"class":682}," clone",[673,3440,3441],{"class":682}," https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog.git\n",[673,3443,3444,3447],{"class":675,"line":803},[673,3445,3446],{"class":962},"cd",[673,3448,3449],{"class":682}," evlog\n",[673,3451,3452,3454],{"class":675,"line":810},[673,3453,667],{"class":679},[673,3455,3456],{"class":682}," install\n",[673,3458,3459,3461,3464],{"class":675,"line":822},[673,3460,667],{"class":679},[673,3462,3463],{"class":682}," example",[673,3465,3466],{"class":682}," react-router\n",[540,3468,3469,3470,3474],{},"Open ",[562,3471,3472],{"href":3472,"rel":3473},"http:\u002F\u002Flocalhost:5173",[566]," to explore the interactive test UI.",[3476,3477,3478],"card-group",{},[3479,3480,3484],"card",{"icon":3481,"title":3482,"to":3483},"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,3486,3488],{"id":3487},"next-steps","Next Steps",[608,3490,3491,3496,3501,3506],{},[611,3492,3493,3495],{},[562,3494,46],{"href":47},": Design comprehensive events with context layering",[611,3497,3498,3500],{},[562,3499,138],{"href":143},": Send logs to Axiom, Sentry, PostHog, and more",[611,3502,3503,3505],{},[562,3504,61],{"href":62},": Control log volume with head and tail sampling",[611,3507,3508,3510,3511,573,3513,577,3515,3517],{},[562,3509,51],{"href":52},": Throw errors with ",[544,3512,2355],{},[544,3514,2358],{},[544,3516,2361],{}," fields",[3519,3520,3521],"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":3523},[3524,3530,3531,3532,3534,3535,3536,3539,3540,3541,3542],{"id":653,"depth":803,"text":25,"children":3525},[3526,3527,3528,3529],{"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":3533},"Background work (log.fork)",{"id":2344,"depth":803,"text":2345},{"id":2671,"depth":803,"text":504},{"id":2684,"depth":803,"text":2685,"children":3537},[3538],{"id":2878,"depth":810,"text":2879},{"id":3111,"depth":803,"text":3112},{"id":3245,"depth":803,"text":3246},{"id":3423,"depth":803,"text":3424},{"id":3487,"depth":803,"text":3488},"Automatic wide events, structured errors, drain adapters, enrichers, and tail sampling in React Router applications.","md",[3546],{"label":3482,"icon":3481,"to":3483,"color":3547,"variant":3548},"neutral","subtle",{},{"title":280,"icon":283},{"title":280,"description":3543},"yMiqNsBA0Hrw-_0_jGgnE5wuCIFWY8BjmyATc2Byhbc",[3554,3556],{"title":275,"path":276,"stem":277,"description":3555,"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":3557,"icon":288,"children":-1},"Wide events, structured errors, and logging in Cloudflare Workers and Durable Objects.",1786743661554]