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