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