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