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