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