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