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