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