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