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