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