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