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