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