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