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