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