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