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