[{"data":1,"prerenderedAt":2822},["ShallowReactive",2],{"navigation_docs":3,"-adapters-building-blocks-custom":402,"-adapters-building-blocks-custom-surround":2817},[4,35,159,201,289,299,386],{"title":5,"path":6,"stem":7,"children":8,"page":34},"Getting Started","\u002Fgetting-started","1.getting-started",[9,14,19,24,29],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick Start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start","i-lucide-zap",{"title":25,"path":26,"stem":27,"icon":28},"Agent Skills","\u002Fgetting-started\u002Fagent-skills","1.getting-started\u002F4.agent-skills","i-lucide-sparkles",{"title":30,"path":31,"stem":32,"icon":33},"vs Other Loggers","\u002Fgetting-started\u002Fvs-other-loggers","1.getting-started\u002F5.vs-other-loggers","i-lucide-scale",false,{"title":36,"path":37,"stem":38,"children":39,"page":34},"Logging","\u002Flogging","2.logging",[40,45,50,55,60,65,70,99,127],{"title":41,"path":42,"stem":43,"icon":44},"Overview","\u002Flogging\u002Foverview","2.logging\u002F0.overview","i-lucide-list",{"title":46,"path":47,"stem":48,"icon":49},"Simple Logging","\u002Flogging\u002Fsimple-logging","2.logging\u002F1.simple-logging","i-lucide-terminal",{"title":51,"path":52,"stem":53,"icon":54},"Wide Events","\u002Flogging\u002Fwide-events","2.logging\u002F2.wide-events","i-lucide-layers",{"title":56,"path":57,"stem":58,"icon":59},"Structured Errors","\u002Flogging\u002Fstructured-errors","2.logging\u002F3.structured-errors","i-lucide-shield-alert",{"title":61,"path":62,"stem":63,"icon":64},"Catalogs","\u002Flogging\u002Fcatalogs","2.logging\u002F4.catalogs","i-lucide-book-open",{"title":66,"path":67,"stem":68,"icon":69},"Client Logging","\u002Flogging\u002Fclient-logging","2.logging\u002F5.client-logging","i-lucide-monitor",{"title":71,"icon":72,"path":73,"stem":74,"children":75,"page":34},"AI SDK","i-simple-icons-vercel","\u002Flogging\u002Fai-sdk","2.logging\u002F6.ai-sdk",[76,79,84,89,94],{"title":41,"path":77,"stem":78,"icon":44},"\u002Flogging\u002Fai-sdk\u002Foverview","2.logging\u002F6.ai-sdk\u002F01.overview",{"title":80,"path":81,"stem":82,"icon":83},"Usage","\u002Flogging\u002Fai-sdk\u002Fusage","2.logging\u002F6.ai-sdk\u002F02.usage","i-lucide-code",{"title":85,"path":86,"stem":87,"icon":88},"Options","\u002Flogging\u002Fai-sdk\u002Foptions","2.logging\u002F6.ai-sdk\u002F03.options","i-lucide-sliders",{"title":90,"path":91,"stem":92,"icon":93},"Metadata","\u002Flogging\u002Fai-sdk\u002Fmetadata","2.logging\u002F6.ai-sdk\u002F04.metadata","i-lucide-database",{"title":95,"path":96,"stem":97,"icon":98},"Telemetry","\u002Flogging\u002Fai-sdk\u002Ftelemetry","2.logging\u002F6.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":100,"icon":101,"path":102,"stem":103,"children":104,"page":34},"Better Auth","i-simple-icons-betterauth","\u002Flogging\u002Fbetter-auth","2.logging\u002F7.better-auth",[105,108,113,118,122],{"title":41,"path":106,"stem":107,"icon":44},"\u002Flogging\u002Fbetter-auth\u002Foverview","2.logging\u002F7.better-auth\u002F01.overview",{"title":109,"path":110,"stem":111,"icon":112},"Identify User","\u002Flogging\u002Fbetter-auth\u002Fidentify-user","2.logging\u002F7.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":114,"path":115,"stem":116,"icon":117},"Middleware","\u002Flogging\u002Fbetter-auth\u002Fmiddleware","2.logging\u002F7.better-auth\u002F03.middleware","i-lucide-shield",{"title":119,"path":120,"stem":121,"icon":69},"Client Sync","\u002Flogging\u002Fbetter-auth\u002Fclient-sync","2.logging\u002F7.better-auth\u002F04.client-sync",{"title":123,"path":124,"stem":125,"icon":126},"Performance","\u002Flogging\u002Fbetter-auth\u002Fperformance","2.logging\u002F7.better-auth\u002F05.performance","i-lucide-gauge",{"title":128,"icon":129,"path":130,"stem":131,"children":132,"page":34},"Audit Logs","i-lucide-shield-check","\u002Flogging\u002Faudit","2.logging\u002F8.audit",[133,136,141,146,151,155],{"title":41,"path":134,"stem":135,"icon":44},"\u002Flogging\u002Faudit\u002Foverview","2.logging\u002F8.audit\u002F01.overview",{"title":137,"path":138,"stem":139,"icon":140},"Schema","\u002Flogging\u002Faudit\u002Fschema","2.logging\u002F8.audit\u002F02.schema","i-lucide-file-text",{"title":142,"path":143,"stem":144,"icon":145},"Recording","\u002Flogging\u002Faudit\u002Frecording","2.logging\u002F8.audit\u002F03.recording","i-lucide-pen-line",{"title":147,"path":148,"stem":149,"icon":150},"Drains","\u002Flogging\u002Faudit\u002Fpipeline","2.logging\u002F8.audit\u002F04.pipeline","i-lucide-link",{"title":152,"path":153,"stem":154,"icon":129},"Compliance","\u002Flogging\u002Faudit\u002Fcompliance","2.logging\u002F8.audit\u002F05.compliance",{"title":156,"path":157,"stem":158,"icon":64},"Recipes","\u002Flogging\u002Faudit\u002Frecipes","2.logging\u002F8.audit\u002F06.recipes",{"title":160,"path":161,"stem":162,"children":163,"page":34},"Core Concepts","\u002Fcore-concepts","3.core-concepts",[164,169,174,179,184,188,191,196],{"title":165,"path":166,"stem":167,"icon":168},"Lifecycle","\u002Fcore-concepts\u002Flifecycle","3.core-concepts\u002F0.lifecycle","i-lucide-arrow-right-left",{"title":170,"path":171,"stem":172,"icon":173},"Configuration","\u002Fcore-concepts\u002Fconfiguration","3.core-concepts\u002F1.configuration","i-lucide-settings",{"title":175,"path":176,"stem":177,"icon":178},"Sampling","\u002Fcore-concepts\u002Fsampling","3.core-concepts\u002F2.sampling","i-lucide-filter",{"title":180,"path":181,"stem":182,"icon":183},"Typed Fields","\u002Fcore-concepts\u002Ftyped-fields","3.core-concepts\u002F3.typed-fields","i-simple-icons-typescript",{"title":185,"path":186,"stem":187,"icon":129},"Best Practices","\u002Fcore-concepts\u002Fbest-practices","3.core-concepts\u002F4.best-practices",{"title":123,"path":189,"stem":190,"icon":126},"\u002Fcore-concepts\u002Fperformance","3.core-concepts\u002F5.performance",{"title":192,"path":193,"stem":194,"icon":195},"Vite Plugin","\u002Fcore-concepts\u002Fvite-plugin","3.core-concepts\u002F6.vite-plugin","i-custom-vite",{"title":197,"path":198,"stem":199,"icon":200},"Auto-Redaction","\u002Fcore-concepts\u002Fredaction","3.core-concepts\u002F7.redaction","i-lucide-eye-off",{"title":202,"path":203,"stem":204,"children":205,"page":34},"Frameworks","\u002Fframeworks","4.frameworks",[206,210,215,220,225,230,235,240,245,250,255,260,265,270,274,279,284],{"title":41,"path":207,"stem":208,"icon":209},"\u002Fframeworks\u002Foverview","4.frameworks\u002F00.overview","i-lucide-layout-grid",{"title":211,"path":212,"stem":213,"icon":214},"Nuxt","\u002Fframeworks\u002Fnuxt","4.frameworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":216,"path":217,"stem":218,"icon":219},"Next.js","\u002Fframeworks\u002Fnextjs","4.frameworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":221,"path":222,"stem":223,"icon":224},"SvelteKit","\u002Fframeworks\u002Fsveltekit","4.frameworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":226,"path":227,"stem":228,"icon":229},"Nitro","\u002Fframeworks\u002Fnitro","4.frameworks\u002F04.nitro","i-custom-nitro",{"title":231,"path":232,"stem":233,"icon":234},"TanStack Start","\u002Fframeworks\u002Ftanstack-start","4.frameworks\u002F05.tanstack-start","i-custom-tanstack",{"title":236,"path":237,"stem":238,"icon":239},"NestJS","\u002Fframeworks\u002Fnestjs","4.frameworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":241,"path":242,"stem":243,"icon":244},"Express","\u002Fframeworks\u002Fexpress","4.frameworks\u002F07.express","i-simple-icons-express",{"title":246,"path":247,"stem":248,"icon":249},"Hono","\u002Fframeworks\u002Fhono","4.frameworks\u002F08.hono","i-simple-icons-hono",{"title":251,"path":252,"stem":253,"icon":254},"Fastify","\u002Fframeworks\u002Ffastify","4.frameworks\u002F09.fastify","i-simple-icons-fastify",{"title":256,"path":257,"stem":258,"icon":259},"Elysia","\u002Fframeworks\u002Felysia","4.frameworks\u002F10.elysia","i-custom-elysia",{"title":261,"path":262,"stem":263,"icon":264},"React Router","\u002Fframeworks\u002Freact-router","4.frameworks\u002F11.react-router","i-custom-reactrouter",{"title":266,"path":267,"stem":268,"icon":269},"Cloudflare Workers","\u002Fframeworks\u002Fcloudflare-workers","4.frameworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":271,"path":272,"stem":273,"icon":183},"Standalone","\u002Fframeworks\u002Fstandalone","4.frameworks\u002F13.standalone",{"title":275,"path":276,"stem":277,"icon":278},"Astro","\u002Fframeworks\u002Fastro","4.frameworks\u002F14.astro","i-simple-icons-astro",{"title":280,"path":281,"stem":282,"icon":283},"AWS Lambda","\u002Fframeworks\u002Faws-lambda","4.frameworks\u002F16.aws-lambda","i-custom-lambda",{"title":285,"path":286,"stem":287,"icon":288},"Custom Integration","\u002Fframeworks\u002Fcustom-integration","4.frameworks\u002F17.custom-integration","i-lucide-puzzle",{"title":290,"path":291,"stem":292,"children":293,"page":34},"Build On Top","\u002Fbuild-on-top","5.build-on-top",[294],{"title":295,"path":296,"stem":297,"icon":298},"FS reader","\u002Fbuild-on-top\u002Ffs-reader","5.build-on-top\u002F4.fs-reader","i-lucide-folder-search",{"title":300,"path":301,"stem":302,"children":303,"page":34},"Adapters","\u002Fadapters","6.adapters",[304,307,347,362],{"title":41,"path":305,"stem":306,"icon":44},"\u002Fadapters\u002Foverview","6.adapters\u002F01.overview",{"title":308,"path":309,"stem":310,"children":311,"page":34},"Cloud destinations","\u002Fadapters\u002Fcloud","6.adapters\u002F02.cloud",[312,317,322,327,332,337,342],{"title":313,"path":314,"stem":315,"icon":316},"Axiom","\u002Fadapters\u002Fcloud\u002Faxiom","6.adapters\u002F02.cloud\u002F01.axiom","i-custom-axiom",{"title":318,"path":319,"stem":320,"icon":321},"OTLP","\u002Fadapters\u002Fcloud\u002Fotlp","6.adapters\u002F02.cloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":323,"path":324,"stem":325,"icon":326},"PostHog","\u002Fadapters\u002Fcloud\u002Fposthog","6.adapters\u002F02.cloud\u002F03.posthog","i-simple-icons-posthog",{"title":328,"path":329,"stem":330,"icon":331},"Sentry","\u002Fadapters\u002Fcloud\u002Fsentry","6.adapters\u002F02.cloud\u002F04.sentry","i-simple-icons-sentry",{"title":333,"path":334,"stem":335,"icon":336},"Better Stack","\u002Fadapters\u002Fcloud\u002Fbetter-stack","6.adapters\u002F02.cloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":338,"path":339,"stem":340,"icon":341},"Datadog","\u002Fadapters\u002Fcloud\u002Fdatadog","6.adapters\u002F02.cloud\u002F06.datadog","i-simple-icons-datadog",{"title":343,"path":344,"stem":345,"icon":346},"HyperDX","\u002Fadapters\u002Fcloud\u002Fhyperdx","6.adapters\u002F02.cloud\u002F07.hyperdx","i-custom-hyperdx",{"title":348,"path":349,"stem":350,"children":351,"page":34},"Self-hosted","\u002Fadapters\u002Fself-hosted","6.adapters\u002F03.self-hosted",[352,357],{"title":353,"path":354,"stem":355,"icon":356},"File System","\u002Fadapters\u002Fself-hosted\u002Ffs","6.adapters\u002F03.self-hosted\u002F01.fs","i-lucide-hard-drive",{"title":358,"path":359,"stem":360,"icon":361},"NuxtHub","\u002Fadapters\u002Fself-hosted\u002Fnuxthub","6.adapters\u002F03.self-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":363,"path":364,"stem":365,"children":366,"page":34},"Building blocks","\u002Fadapters\u002Fbuilding-blocks","6.adapters\u002F04.building-blocks",[367,372,377,381],{"title":368,"path":369,"stem":370,"icon":371},"Pipeline","\u002Fadapters\u002Fbuilding-blocks\u002Fpipeline","6.adapters\u002F04.building-blocks\u002F01.pipeline","i-lucide-workflow",{"title":373,"path":374,"stem":375,"icon":376},"HTTP","\u002Fadapters\u002Fbuilding-blocks\u002Fhttp","6.adapters\u002F04.building-blocks\u002F02.http","i-lucide-globe",{"title":378,"path":379,"stem":380,"icon":83},"Custom Adapters","\u002Fadapters\u002Fbuilding-blocks\u002Fcustom","6.adapters\u002F04.building-blocks\u002F03.custom",{"title":382,"path":383,"stem":384,"icon":385},"Toolkit","\u002Fadapters\u002Fbuilding-blocks\u002Ftoolkit","6.adapters\u002F04.building-blocks\u002F04.toolkit","i-lucide-blocks",{"title":387,"path":388,"stem":389,"children":390,"page":34},"Enrichers","\u002Fenrichers","7.enrichers",[391,394,398],{"title":41,"path":392,"stem":393,"icon":28},"\u002Fenrichers\u002Foverview","7.enrichers\u002F1.overview",{"title":395,"path":396,"stem":397,"icon":288},"Built-in","\u002Fenrichers\u002Fbuilt-in","7.enrichers\u002F2.built-in",{"title":399,"path":400,"stem":401,"icon":83},"Custom","\u002Fenrichers\u002Fcustom","7.enrichers\u002F3.custom",{"id":403,"title":378,"body":404,"description":2806,"extension":2807,"links":2808,"meta":2813,"navigation":2814,"path":379,"seo":2815,"stem":380,"__hash__":2816},"docs\u002F6.adapters\u002F04.building-blocks\u002F03.custom.md",{"type":405,"value":406,"toc":2794},"minimark",[407,427,437,484,492,499,1165,1171,1174,1512,1516,1777,1781,1787,1819,1852,1856,1865,2228,2238,2244,2250,2448,2451,2455,2462,2686,2695,2699,2704,2747,2761,2765,2790],[408,409,410,414,415,418,419,422,423,426],"p",{},[411,412,413],"code",{},"evlog\u002Ftoolkit"," ships ",[411,416,417],{},"defineHttpDrain"," — the same factory every built-in adapter uses. You provide two pure functions (",[411,420,421],{},"resolve()"," for config, ",[411,424,425],{},"encode()"," for the payload) and the toolkit handles batching, retries, timeouts, and error isolation.",[408,428,429,430,433,434,436],{},"A drain at its lowest level is still just a function that receives a ",[411,431,432],{},"DrainContext"," and sends data somewhere — but in practice, you should reach for ",[411,435,417],{}," first.",[438,439,442,445,470],"prompt",{":actions":440,"description":441,"icon":83},"[\"copy\",\"cursor\",\"windsurf\"]","Build a custom drain adapter",[408,443,444],{},"Build a custom evlog drain adapter that sends wide events to my destination.",[446,447,448,452,455,458,461,464,467],"ul",{},[449,450,451],"li",{},"Use defineHttpDrain from evlog\u002Ftoolkit — never call fetch directly",[449,453,454],{},"Provide a resolve() function returning the config (or null to skip)",[449,456,457],{},"Provide an encode(events, config) function returning { url, headers, body } (or null to skip)",[449,459,460],{},"For config use resolveAdapterConfig from evlog\u002Ftoolkit so users get the standard precedence (overrides → runtimeConfig → env)",[449,462,463],{},"Use the standardized field names: apiKey for bearer secrets, endpoint for the base URL, serviceName, timeout",[449,465,466],{},"defineHttpDrain handles retries, timeouts, error isolation, and batching — don't reimplement them",[449,468,469],{},"Wire the drain via defineEvlog({ drain: createMyDrain() }) or your framework's middleware drain option",[408,471,472,473,479,480],{},"Docs: ",[474,475,476],"a",{"href":476,"rel":477},"https:\u002F\u002Fwww.evlog.dev\u002Fadapters\u002Fbuilding-blocks\u002Fcustom",[478],"nofollow","\nPipeline: ",[474,481,482],{"href":482,"rel":483},"https:\u002F\u002Fwww.evlog.dev\u002Fadapters\u002Fbuilding-blocks\u002Fpipeline",[478],[485,486,488,489,491],"h2",{"id":487},"recipe-definehttpdrain-in-15-lines","Recipe — ",[411,490,417],{}," in 15 lines",[408,493,494,495,498],{},"The recipe every built-in adapter follows. Replace ",[411,496,497],{},"myservice"," with your service name.",[500,501,507],"pre",{"className":502,"code":503,"filename":504,"language":505,"meta":506,"style":506},"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","",[411,508,509,522,532,540,551,569,576,589,602,613,624,630,635,666,709,744,763,769,774,808,828,844,863,907,932,954,963,969,983,989,1015,1052,1062,1084,1112,1118,1142,1152,1160],{"__ignoreMap":506},[510,511,514,518],"span",{"class":512,"line":513},"line",1,[510,515,517],{"class":516},"s7zQu","import",[510,519,521],{"class":520},"sMK4o"," {\n",[510,523,525,529],{"class":512,"line":524},2,[510,526,528],{"class":527},"sTEyZ","  defineHttpDrain",[510,530,531],{"class":520},",\n",[510,533,535,538],{"class":512,"line":534},3,[510,536,537],{"class":527},"  resolveAdapterConfig",[510,539,531],{"class":520},[510,541,543,546,549],{"class":512,"line":542},4,[510,544,545],{"class":516},"  type",[510,547,548],{"class":527}," ConfigField",[510,550,531],{"class":520},[510,552,554,557,560,563,566],{"class":512,"line":553},5,[510,555,556],{"class":520},"}",[510,558,559],{"class":516}," from",[510,561,562],{"class":520}," '",[510,564,413],{"class":565},"sfazB",[510,567,568],{"class":520},"'\n",[510,570,572],{"class":512,"line":571},6,[510,573,575],{"emptyLinePlaceholder":574},true,"\n",[510,577,579,583,587],{"class":512,"line":578},7,[510,580,582],{"class":581},"spNyl","interface",[510,584,586],{"class":585},"sBMFI"," MyServiceConfig",[510,588,521],{"class":520},[510,590,592,596,599],{"class":512,"line":591},8,[510,593,595],{"class":594},"swJcz","  apiKey",[510,597,598],{"class":520},":",[510,600,601],{"class":585}," string\n",[510,603,605,608,611],{"class":512,"line":604},9,[510,606,607],{"class":594},"  endpoint",[510,609,610],{"class":520},"?:",[510,612,601],{"class":585},[510,614,616,619,621],{"class":512,"line":615},10,[510,617,618],{"class":594},"  timeout",[510,620,610],{"class":520},[510,622,623],{"class":585}," number\n",[510,625,627],{"class":512,"line":626},11,[510,628,629],{"class":520},"}\n",[510,631,633],{"class":512,"line":632},12,[510,634,575],{"emptyLinePlaceholder":574},[510,636,638,641,644,646,648,651,654,657,660,663],{"class":512,"line":637},13,[510,639,640],{"class":581},"const",[510,642,643],{"class":527}," FIELDS",[510,645,598],{"class":520},[510,647,548],{"class":585},[510,649,650],{"class":520},"\u003C",[510,652,653],{"class":585},"MyServiceConfig",[510,655,656],{"class":520},">",[510,658,659],{"class":527},"[] ",[510,661,662],{"class":520},"=",[510,664,665],{"class":527}," [\n",[510,667,669,672,675,677,679,682,685,688,691,693,696,698,701,703,706],{"class":512,"line":668},14,[510,670,671],{"class":520},"  {",[510,673,674],{"class":594}," key",[510,676,598],{"class":520},[510,678,562],{"class":520},[510,680,681],{"class":565},"apiKey",[510,683,684],{"class":520},"'",[510,686,687],{"class":520},",",[510,689,690],{"class":594}," env",[510,692,598],{"class":520},[510,694,695],{"class":527}," [",[510,697,684],{"class":520},[510,699,700],{"class":565},"MYSERVICE_API_KEY",[510,702,684],{"class":520},[510,704,705],{"class":527},"] ",[510,707,708],{"class":520},"},\n",[510,710,712,714,716,718,720,723,725,727,729,731,733,735,738,740,742],{"class":512,"line":711},15,[510,713,671],{"class":520},[510,715,674],{"class":594},[510,717,598],{"class":520},[510,719,562],{"class":520},[510,721,722],{"class":565},"endpoint",[510,724,684],{"class":520},[510,726,687],{"class":520},[510,728,690],{"class":594},[510,730,598],{"class":520},[510,732,695],{"class":527},[510,734,684],{"class":520},[510,736,737],{"class":565},"MYSERVICE_ENDPOINT",[510,739,684],{"class":520},[510,741,705],{"class":527},[510,743,708],{"class":520},[510,745,747,749,751,753,755,758,760],{"class":512,"line":746},16,[510,748,671],{"class":520},[510,750,674],{"class":594},[510,752,598],{"class":520},[510,754,562],{"class":520},[510,756,757],{"class":565},"timeout",[510,759,684],{"class":520},[510,761,762],{"class":520}," },\n",[510,764,766],{"class":512,"line":765},17,[510,767,768],{"class":527},"]\n",[510,770,772],{"class":512,"line":771},18,[510,773,575],{"emptyLinePlaceholder":574},[510,775,777,780,783,787,790,794,796,799,801,803,806],{"class":512,"line":776},19,[510,778,779],{"class":516},"export",[510,781,782],{"class":581}," function",[510,784,786],{"class":785},"s2Zo4"," createMyServiceDrain",[510,788,789],{"class":520},"(",[510,791,793],{"class":792},"sHdIc","overrides",[510,795,610],{"class":520},[510,797,798],{"class":585}," Partial",[510,800,650],{"class":520},[510,802,653],{"class":585},[510,804,805],{"class":520},">)",[510,807,521],{"class":520},[510,809,811,814,817,819,821,823,825],{"class":512,"line":810},20,[510,812,813],{"class":516},"  return",[510,815,816],{"class":785}," defineHttpDrain",[510,818,650],{"class":520},[510,820,653],{"class":585},[510,822,656],{"class":520},[510,824,789],{"class":594},[510,826,827],{"class":520},"{\n",[510,829,831,834,836,838,840,842],{"class":512,"line":830},21,[510,832,833],{"class":594},"    name",[510,835,598],{"class":520},[510,837,562],{"class":520},[510,839,497],{"class":565},[510,841,684],{"class":520},[510,843,531],{"class":520},[510,845,847,850,852,855,858,861],{"class":512,"line":846},22,[510,848,849],{"class":785},"    resolve",[510,851,598],{"class":520},[510,853,854],{"class":581}," async",[510,856,857],{"class":520}," ()",[510,859,860],{"class":581}," =>",[510,862,521],{"class":520},[510,864,866,869,872,875,878,881,883,885,887,889,891,893,895,897,899,901,904],{"class":512,"line":865},23,[510,867,868],{"class":581},"      const",[510,870,871],{"class":527}," cfg",[510,873,874],{"class":520}," =",[510,876,877],{"class":516}," await",[510,879,880],{"class":785}," resolveAdapterConfig",[510,882,650],{"class":520},[510,884,653],{"class":585},[510,886,656],{"class":520},[510,888,789],{"class":594},[510,890,684],{"class":520},[510,892,497],{"class":565},[510,894,684],{"class":520},[510,896,687],{"class":520},[510,898,643],{"class":527},[510,900,687],{"class":520},[510,902,903],{"class":527}," overrides",[510,905,906],{"class":594},")\n",[510,908,910,913,916,919,922,925,927,930],{"class":512,"line":909},24,[510,911,912],{"class":516},"      if",[510,914,915],{"class":594}," (",[510,917,918],{"class":520},"!",[510,920,921],{"class":527},"cfg",[510,923,924],{"class":520},".",[510,926,681],{"class":527},[510,928,929],{"class":594},") ",[510,931,827],{"class":520},[510,933,935,938,940,943,945,947,950,952],{"class":512,"line":934},25,[510,936,937],{"class":527},"        console",[510,939,924],{"class":520},[510,941,942],{"class":785},"error",[510,944,789],{"class":594},[510,946,684],{"class":520},[510,948,949],{"class":565},"[evlog\u002Fmyservice] Missing apiKey",[510,951,684],{"class":520},[510,953,906],{"class":594},[510,955,957,960],{"class":512,"line":956},26,[510,958,959],{"class":516},"        return",[510,961,962],{"class":520}," null\n",[510,964,966],{"class":512,"line":965},27,[510,967,968],{"class":520},"      }\n",[510,970,972,975,977,980],{"class":512,"line":971},28,[510,973,974],{"class":516},"      return",[510,976,871],{"class":527},[510,978,979],{"class":516}," as",[510,981,982],{"class":585}," MyServiceConfig\n",[510,984,986],{"class":512,"line":985},29,[510,987,988],{"class":520},"    },\n",[510,990,992,995,997,999,1002,1004,1006,1009,1011,1013],{"class":512,"line":991},30,[510,993,994],{"class":785},"    encode",[510,996,598],{"class":520},[510,998,915],{"class":520},[510,1000,1001],{"class":792},"events",[510,1003,687],{"class":520},[510,1005,871],{"class":792},[510,1007,1008],{"class":520},")",[510,1010,860],{"class":581},[510,1012,915],{"class":594},[510,1014,827],{"class":520},[510,1016,1018,1021,1023,1026,1028,1030,1033,1036,1038,1041,1044,1047,1050],{"class":512,"line":1017},31,[510,1019,1020],{"class":594},"      url",[510,1022,598],{"class":520},[510,1024,1025],{"class":520}," `${",[510,1027,921],{"class":527},[510,1029,924],{"class":520},[510,1031,1032],{"class":527},"endpoint ",[510,1034,1035],{"class":520},"??",[510,1037,562],{"class":520},[510,1039,1040],{"class":565},"https:\u002F\u002Fapi.myservice.com",[510,1042,1043],{"class":520},"'}",[510,1045,1046],{"class":565},"\u002Fv1\u002Fingest",[510,1048,1049],{"class":520},"`",[510,1051,531],{"class":520},[510,1053,1055,1058,1060],{"class":512,"line":1054},32,[510,1056,1057],{"class":594},"      headers",[510,1059,598],{"class":520},[510,1061,521],{"class":520},[510,1063,1065,1068,1071,1073,1075,1077,1080,1082],{"class":512,"line":1064},33,[510,1066,1067],{"class":520},"        '",[510,1069,1070],{"class":594},"Content-Type",[510,1072,684],{"class":520},[510,1074,598],{"class":520},[510,1076,562],{"class":520},[510,1078,1079],{"class":565},"application\u002Fjson",[510,1081,684],{"class":520},[510,1083,531],{"class":520},[510,1085,1087,1090,1092,1095,1098,1101,1103,1105,1107,1110],{"class":512,"line":1086},34,[510,1088,1089],{"class":594},"        Authorization",[510,1091,598],{"class":520},[510,1093,1094],{"class":520}," `",[510,1096,1097],{"class":565},"Bearer ",[510,1099,1100],{"class":520},"${",[510,1102,921],{"class":527},[510,1104,924],{"class":520},[510,1106,681],{"class":527},[510,1108,1109],{"class":520},"}`",[510,1111,531],{"class":520},[510,1113,1115],{"class":512,"line":1114},35,[510,1116,1117],{"class":520},"      },\n",[510,1119,1121,1124,1126,1129,1131,1134,1136,1138,1140],{"class":512,"line":1120},36,[510,1122,1123],{"class":594},"      body",[510,1125,598],{"class":520},[510,1127,1128],{"class":527}," JSON",[510,1130,924],{"class":520},[510,1132,1133],{"class":785},"stringify",[510,1135,789],{"class":594},[510,1137,1001],{"class":527},[510,1139,1008],{"class":594},[510,1141,531],{"class":520},[510,1143,1145,1148,1150],{"class":512,"line":1144},37,[510,1146,1147],{"class":520},"    }",[510,1149,1008],{"class":594},[510,1151,531],{"class":520},[510,1153,1155,1158],{"class":512,"line":1154},38,[510,1156,1157],{"class":520},"  }",[510,1159,906],{"class":594},[510,1161,1163],{"class":512,"line":1162},39,[510,1164,629],{"class":520},[408,1166,1167,1168,1170],{},"That's it. ",[411,1169,417],{}," handles retries (default 2), timeouts (default 5000ms), and error isolation — your app pipeline keeps running even if your destination is down.",[408,1172,1173],{},"Then wire it to your framework:",[1175,1176,1177,1249,1351,1384,1410,1441,1467,1492],"code-group",{},[500,1178,1181],{"className":502,"code":1179,"filename":1180,"language":505,"meta":506,"style":506},"\u002F\u002F server\u002Fplugins\u002Fevlog-drain.ts\nexport default defineNitroPlugin((nitroApp) => {\n  nitroApp.hooks.hook('evlog:drain', drain)\n})\n","Nuxt \u002F Nitro",[411,1182,1183,1189,1212,1243],{"__ignoreMap":506},[510,1184,1185],{"class":512,"line":513},[510,1186,1188],{"class":1187},"sHwdD","\u002F\u002F server\u002Fplugins\u002Fevlog-drain.ts\n",[510,1190,1191,1193,1196,1199,1201,1203,1206,1208,1210],{"class":512,"line":524},[510,1192,779],{"class":516},[510,1194,1195],{"class":516}," default",[510,1197,1198],{"class":785}," defineNitroPlugin",[510,1200,789],{"class":527},[510,1202,789],{"class":520},[510,1204,1205],{"class":792},"nitroApp",[510,1207,1008],{"class":520},[510,1209,860],{"class":581},[510,1211,521],{"class":520},[510,1213,1214,1217,1219,1222,1224,1227,1229,1231,1234,1236,1238,1241],{"class":512,"line":534},[510,1215,1216],{"class":527},"  nitroApp",[510,1218,924],{"class":520},[510,1220,1221],{"class":527},"hooks",[510,1223,924],{"class":520},[510,1225,1226],{"class":785},"hook",[510,1228,789],{"class":594},[510,1230,684],{"class":520},[510,1232,1233],{"class":565},"evlog:drain",[510,1235,684],{"class":520},[510,1237,687],{"class":520},[510,1239,1240],{"class":527}," drain",[510,1242,906],{"class":594},[510,1244,1245,1247],{"class":512,"line":542},[510,1246,556],{"class":520},[510,1248,906],{"class":527},[500,1250,1252],{"className":502,"code":1251,"filename":216,"language":505,"meta":506,"style":506},"\u002F\u002F lib\u002Fevlog.ts\nimport { createEvlog } from 'evlog\u002Fnext'\n\nexport const { withEvlog, useLogger, log, createError } = createEvlog({\n  service: 'my-app',\n  drain,\n})\n",[411,1253,1254,1259,1281,1285,1322,1338,1345],{"__ignoreMap":506},[510,1255,1256],{"class":512,"line":513},[510,1257,1258],{"class":1187},"\u002F\u002F lib\u002Fevlog.ts\n",[510,1260,1261,1263,1266,1269,1272,1274,1276,1279],{"class":512,"line":524},[510,1262,517],{"class":516},[510,1264,1265],{"class":520}," {",[510,1267,1268],{"class":527}," createEvlog",[510,1270,1271],{"class":520}," }",[510,1273,559],{"class":516},[510,1275,562],{"class":520},[510,1277,1278],{"class":565},"evlog\u002Fnext",[510,1280,568],{"class":520},[510,1282,1283],{"class":512,"line":534},[510,1284,575],{"emptyLinePlaceholder":574},[510,1286,1287,1289,1292,1294,1297,1299,1302,1304,1307,1309,1312,1314,1316,1318,1320],{"class":512,"line":542},[510,1288,779],{"class":516},[510,1290,1291],{"class":581}," const",[510,1293,1265],{"class":520},[510,1295,1296],{"class":527}," withEvlog",[510,1298,687],{"class":520},[510,1300,1301],{"class":527}," useLogger",[510,1303,687],{"class":520},[510,1305,1306],{"class":527}," log",[510,1308,687],{"class":520},[510,1310,1311],{"class":527}," createError ",[510,1313,556],{"class":520},[510,1315,874],{"class":520},[510,1317,1268],{"class":785},[510,1319,789],{"class":527},[510,1321,827],{"class":520},[510,1323,1324,1327,1329,1331,1334,1336],{"class":512,"line":553},[510,1325,1326],{"class":594},"  service",[510,1328,598],{"class":520},[510,1330,562],{"class":520},[510,1332,1333],{"class":565},"my-app",[510,1335,684],{"class":520},[510,1337,531],{"class":520},[510,1339,1340,1343],{"class":512,"line":571},[510,1341,1342],{"class":527},"  drain",[510,1344,531],{"class":520},[510,1346,1347,1349],{"class":512,"line":578},[510,1348,556],{"class":520},[510,1350,906],{"class":527},[500,1352,1354],{"className":502,"code":1353,"filename":246,"language":505,"meta":506,"style":506},"app.use(evlog({ drain }))\n",[411,1355,1356],{"__ignoreMap":506},[510,1357,1358,1361,1363,1366,1368,1371,1373,1376,1379,1381],{"class":512,"line":513},[510,1359,1360],{"class":527},"app",[510,1362,924],{"class":520},[510,1364,1365],{"class":785},"use",[510,1367,789],{"class":527},[510,1369,1370],{"class":785},"evlog",[510,1372,789],{"class":527},[510,1374,1375],{"class":520},"{",[510,1377,1378],{"class":527}," drain ",[510,1380,556],{"class":520},[510,1382,1383],{"class":527},"))\n",[500,1385,1386],{"className":502,"code":1353,"filename":241,"language":505,"meta":506,"style":506},[411,1387,1388],{"__ignoreMap":506},[510,1389,1390,1392,1394,1396,1398,1400,1402,1404,1406,1408],{"class":512,"line":513},[510,1391,1360],{"class":527},[510,1393,924],{"class":520},[510,1395,1365],{"class":785},[510,1397,789],{"class":527},[510,1399,1370],{"class":785},[510,1401,789],{"class":527},[510,1403,1375],{"class":520},[510,1405,1378],{"class":527},[510,1407,556],{"class":520},[510,1409,1383],{"class":527},[500,1411,1413],{"className":502,"code":1412,"filename":251,"language":505,"meta":506,"style":506},"await app.register(evlog, { drain })\n",[411,1414,1415],{"__ignoreMap":506},[510,1416,1417,1420,1423,1425,1428,1431,1433,1435,1437,1439],{"class":512,"line":513},[510,1418,1419],{"class":516},"await",[510,1421,1422],{"class":527}," app",[510,1424,924],{"class":520},[510,1426,1427],{"class":785},"register",[510,1429,1430],{"class":527},"(evlog",[510,1432,687],{"class":520},[510,1434,1265],{"class":520},[510,1436,1378],{"class":527},[510,1438,556],{"class":520},[510,1440,906],{"class":527},[500,1442,1443],{"className":502,"code":1353,"filename":256,"language":505,"meta":506,"style":506},[411,1444,1445],{"__ignoreMap":506},[510,1446,1447,1449,1451,1453,1455,1457,1459,1461,1463,1465],{"class":512,"line":513},[510,1448,1360],{"class":527},[510,1450,924],{"class":520},[510,1452,1365],{"class":785},[510,1454,789],{"class":527},[510,1456,1370],{"class":785},[510,1458,789],{"class":527},[510,1460,1375],{"class":520},[510,1462,1378],{"class":527},[510,1464,556],{"class":520},[510,1466,1383],{"class":527},[500,1468,1470],{"className":502,"code":1469,"filename":236,"language":505,"meta":506,"style":506},"EvlogModule.forRoot({ drain })\n",[411,1471,1472],{"__ignoreMap":506},[510,1473,1474,1477,1479,1482,1484,1486,1488,1490],{"class":512,"line":513},[510,1475,1476],{"class":527},"EvlogModule",[510,1478,924],{"class":520},[510,1480,1481],{"class":785},"forRoot",[510,1483,789],{"class":527},[510,1485,1375],{"class":520},[510,1487,1378],{"class":527},[510,1489,556],{"class":520},[510,1491,906],{"class":527},[500,1493,1495],{"className":502,"code":1494,"filename":271,"language":505,"meta":506,"style":506},"initLogger({ drain })\n",[411,1496,1497],{"__ignoreMap":506},[510,1498,1499,1502,1504,1506,1508,1510],{"class":512,"line":513},[510,1500,1501],{"class":785},"initLogger",[510,1503,789],{"class":527},[510,1505,1375],{"class":520},[510,1507,1378],{"class":527},[510,1509,556],{"class":520},[510,1511,906],{"class":527},[485,1513,1515],{"id":1514},"draincontext-reference","DrainContext Reference",[500,1517,1520],{"className":502,"code":1518,"filename":1519,"language":505,"meta":506,"style":506},"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",[411,1521,1522,1531,1536,1546,1550,1555,1564,1573,1582,1591,1596,1600,1605,1628,1632,1636,1645,1654,1695,1703,1712,1721,1730,1739,1748,1753,1773],{"__ignoreMap":506},[510,1523,1524,1526,1529],{"class":512,"line":513},[510,1525,582],{"class":581},[510,1527,1528],{"class":585}," DrainContext",[510,1530,521],{"class":520},[510,1532,1533],{"class":512,"line":524},[510,1534,1535],{"class":1187},"  \u002F** The complete wide event with all accumulated context *\u002F\n",[510,1537,1538,1541,1543],{"class":512,"line":534},[510,1539,1540],{"class":594},"  event",[510,1542,598],{"class":520},[510,1544,1545],{"class":585}," WideEvent\n",[510,1547,1548],{"class":512,"line":542},[510,1549,575],{"emptyLinePlaceholder":574},[510,1551,1552],{"class":512,"line":553},[510,1553,1554],{"class":1187},"  \u002F** Request metadata *\u002F\n",[510,1556,1557,1560,1562],{"class":512,"line":571},[510,1558,1559],{"class":594},"  request",[510,1561,610],{"class":520},[510,1563,521],{"class":520},[510,1565,1566,1569,1571],{"class":512,"line":578},[510,1567,1568],{"class":594},"    method",[510,1570,598],{"class":520},[510,1572,601],{"class":585},[510,1574,1575,1578,1580],{"class":512,"line":591},[510,1576,1577],{"class":594},"    path",[510,1579,598],{"class":520},[510,1581,601],{"class":585},[510,1583,1584,1587,1589],{"class":512,"line":604},[510,1585,1586],{"class":594},"    requestId",[510,1588,598],{"class":520},[510,1590,601],{"class":585},[510,1592,1593],{"class":512,"line":615},[510,1594,1595],{"class":520},"  }\n",[510,1597,1598],{"class":512,"line":626},[510,1599,575],{"emptyLinePlaceholder":574},[510,1601,1602],{"class":512,"line":632},[510,1603,1604],{"class":1187},"  \u002F** Safe HTTP headers (sensitive headers filtered) *\u002F\n",[510,1606,1607,1610,1612,1615,1617,1620,1622,1625],{"class":512,"line":637},[510,1608,1609],{"class":594},"  headers",[510,1611,610],{"class":520},[510,1613,1614],{"class":585}," Record",[510,1616,650],{"class":520},[510,1618,1619],{"class":585},"string",[510,1621,687],{"class":520},[510,1623,1624],{"class":585}," string",[510,1626,1627],{"class":520},">\n",[510,1629,1630],{"class":512,"line":668},[510,1631,629],{"class":520},[510,1633,1634],{"class":512,"line":711},[510,1635,575],{"emptyLinePlaceholder":574},[510,1637,1638,1640,1643],{"class":512,"line":746},[510,1639,582],{"class":581},[510,1641,1642],{"class":585}," WideEvent",[510,1644,521],{"class":520},[510,1646,1647,1650,1652],{"class":512,"line":765},[510,1648,1649],{"class":594},"  timestamp",[510,1651,598],{"class":520},[510,1653,601],{"class":585},[510,1655,1656,1659,1661,1663,1666,1668,1671,1673,1676,1678,1680,1682,1685,1687,1689,1691,1693],{"class":512,"line":771},[510,1657,1658],{"class":594},"  level",[510,1660,598],{"class":520},[510,1662,562],{"class":520},[510,1664,1665],{"class":565},"debug",[510,1667,684],{"class":520},[510,1669,1670],{"class":520}," |",[510,1672,562],{"class":520},[510,1674,1675],{"class":565},"info",[510,1677,684],{"class":520},[510,1679,1670],{"class":520},[510,1681,562],{"class":520},[510,1683,1684],{"class":565},"warn",[510,1686,684],{"class":520},[510,1688,1670],{"class":520},[510,1690,562],{"class":520},[510,1692,942],{"class":565},[510,1694,568],{"class":520},[510,1696,1697,1699,1701],{"class":512,"line":776},[510,1698,1326],{"class":594},[510,1700,598],{"class":520},[510,1702,601],{"class":585},[510,1704,1705,1708,1710],{"class":512,"line":810},[510,1706,1707],{"class":594},"  environment",[510,1709,610],{"class":520},[510,1711,601],{"class":585},[510,1713,1714,1717,1719],{"class":512,"line":830},[510,1715,1716],{"class":594},"  version",[510,1718,610],{"class":520},[510,1720,601],{"class":585},[510,1722,1723,1726,1728],{"class":512,"line":846},[510,1724,1725],{"class":594},"  region",[510,1727,610],{"class":520},[510,1729,601],{"class":585},[510,1731,1732,1735,1737],{"class":512,"line":865},[510,1733,1734],{"class":594},"  commitHash",[510,1736,610],{"class":520},[510,1738,601],{"class":585},[510,1740,1741,1744,1746],{"class":512,"line":909},[510,1742,1743],{"class":594},"  requestId",[510,1745,610],{"class":520},[510,1747,601],{"class":585},[510,1749,1750],{"class":512,"line":934},[510,1751,1752],{"class":1187},"  \u002F\u002F ... plus all fields added via log.set()\n",[510,1754,1755,1758,1761,1763,1765,1768,1770],{"class":512,"line":956},[510,1756,1757],{"class":527},"  [",[510,1759,1760],{"class":792},"key",[510,1762,598],{"class":520},[510,1764,1624],{"class":585},[510,1766,1767],{"class":527},"]",[510,1769,598],{"class":520},[510,1771,1772],{"class":585}," unknown\n",[510,1774,1775],{"class":512,"line":965},[510,1776,629],{"class":520},[485,1778,1780],{"id":1779},"standardized-config-priority","Standardized config priority",[408,1782,1783,1786],{},[411,1784,1785],{},"resolveAdapterConfig(namespace, fields, overrides)"," walks the standard chain so users get the same configuration UX as built-in adapters:",[1788,1789,1790,1796,1802,1808,1814],"ol",{},[449,1791,1792,1793,1795],{},"Explicit ",[411,1794,793],{}," passed to your factory",[449,1797,1798,1801],{},[411,1799,1800],{},"runtimeConfig.evlog.\u003Cnamespace>"," (Nuxt\u002FNitro)",[449,1803,1804,1807],{},[411,1805,1806],{},"runtimeConfig.\u003Cnamespace>"," (legacy Nuxt\u002FNitro)",[449,1809,1810,1813],{},[411,1811,1812],{},"NUXT_\u003CNS>_\u003CFIELD>"," env vars",[449,1815,1816,1813],{},[411,1817,1818],{},"\u003CNS>_\u003CFIELD>",[408,1820,1821,1822,1824,1825,1824,1827,1824,1830,1832,1833,1836,1837,1839,1840,1843,1844,1847,1848,1851],{},"Field names should follow the project conventions: ",[411,1823,681],{},", ",[411,1826,722],{},[411,1828,1829],{},"serviceName",[411,1831,757],{},". If you're renaming an existing field (e.g. ",[411,1834,1835],{},"token"," → ",[411,1838,681],{},"), keep both as ",[411,1841,1842],{},"ConfigField"," entries for one major version — see ",[411,1845,1846],{},"axiom.ts"," and ",[411,1849,1850],{},"better-stack.ts"," for the deprecation pattern.",[485,1853,1855],{"id":1854},"filtering-and-transforming-events","Filtering and transforming events",[408,1857,1858,1860,1861,1864],{},[411,1859,425],{}," receives the full batch of ",[411,1862,1863],{},"WideEvent[]"," plus the resolved config. Filter or transform inline:",[500,1866,1868],{"className":502,"code":1867,"language":505,"meta":506,"style":506},"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, duration: e.duration },\n  }))\n\n  return {\n    url: `${cfg.endpoint}\u002Fv1\u002Fpush`,\n    headers: { 'Content-Type': 'application\u002Fjson' },\n    body: JSON.stringify(payload),\n  }\n}\n",[411,1869,1870,1891,1955,1983,1987,2013,2047,2069,2133,2139,2143,2149,2173,2198,2220,2224],{"__ignoreMap":506},[510,1871,1872,1875,1877,1879,1881,1883,1885,1887,1889],{"class":512,"line":513},[510,1873,1874],{"class":585},"encode",[510,1876,598],{"class":520},[510,1878,915],{"class":520},[510,1880,1001],{"class":792},[510,1882,687],{"class":520},[510,1884,871],{"class":792},[510,1886,1008],{"class":520},[510,1888,860],{"class":581},[510,1890,521],{"class":520},[510,1892,1893,1896,1899,1901,1904,1906,1909,1911,1914,1916,1919,1921,1924,1927,1929,1931,1933,1936,1938,1940,1943,1946,1948,1951,1953],{"class":512,"line":524},[510,1894,1895],{"class":581},"  const",[510,1897,1898],{"class":527}," filtered",[510,1900,874],{"class":520},[510,1902,1903],{"class":527}," events",[510,1905,924],{"class":520},[510,1907,1908],{"class":785},"filter",[510,1910,789],{"class":594},[510,1912,1913],{"class":792},"e",[510,1915,860],{"class":581},[510,1917,1918],{"class":527}," e",[510,1920,924],{"class":520},[510,1922,1923],{"class":527},"level",[510,1925,1926],{"class":520}," ===",[510,1928,562],{"class":520},[510,1930,942],{"class":565},[510,1932,684],{"class":520},[510,1934,1935],{"class":520}," &&",[510,1937,1918],{"class":527},[510,1939,924],{"class":520},[510,1941,1942],{"class":527},"path",[510,1944,1945],{"class":520}," !==",[510,1947,562],{"class":520},[510,1949,1950],{"class":565},"\u002Fhealth",[510,1952,684],{"class":520},[510,1954,906],{"class":594},[510,1956,1957,1960,1962,1965,1967,1970,1972,1976,1978,1981],{"class":512,"line":534},[510,1958,1959],{"class":516},"  if",[510,1961,915],{"class":594},[510,1963,1964],{"class":527},"filtered",[510,1966,924],{"class":520},[510,1968,1969],{"class":527},"length",[510,1971,1926],{"class":520},[510,1973,1975],{"class":1974},"sbssI"," 0",[510,1977,929],{"class":594},[510,1979,1980],{"class":516},"return",[510,1982,962],{"class":520},[510,1984,1985],{"class":512,"line":542},[510,1986,575],{"emptyLinePlaceholder":574},[510,1988,1989,1991,1994,1996,1998,2000,2003,2005,2007,2009,2011],{"class":512,"line":553},[510,1990,1895],{"class":581},[510,1992,1993],{"class":527}," payload",[510,1995,874],{"class":520},[510,1997,1898],{"class":527},[510,1999,924],{"class":520},[510,2001,2002],{"class":785},"map",[510,2004,789],{"class":594},[510,2006,1913],{"class":792},[510,2008,860],{"class":581},[510,2010,915],{"class":594},[510,2012,827],{"class":520},[510,2014,2015,2018,2020,2023,2026,2028,2030,2032,2035,2037,2039,2042,2045],{"class":512,"line":571},[510,2016,2017],{"class":594},"    ts",[510,2019,598],{"class":520},[510,2021,2022],{"class":520}," new",[510,2024,2025],{"class":785}," Date",[510,2027,789],{"class":594},[510,2029,1913],{"class":527},[510,2031,924],{"class":520},[510,2033,2034],{"class":527},"timestamp",[510,2036,1008],{"class":594},[510,2038,924],{"class":520},[510,2040,2041],{"class":785},"getTime",[510,2043,2044],{"class":594},"()",[510,2046,531],{"class":520},[510,2048,2049,2052,2054,2056,2058,2060,2062,2065,2067],{"class":512,"line":578},[510,2050,2051],{"class":594},"    severity",[510,2053,598],{"class":520},[510,2055,1918],{"class":527},[510,2057,924],{"class":520},[510,2059,1923],{"class":527},[510,2061,924],{"class":520},[510,2063,2064],{"class":785},"toUpperCase",[510,2066,2044],{"class":594},[510,2068,531],{"class":520},[510,2070,2071,2074,2076,2078,2081,2083,2085,2087,2090,2092,2095,2097,2099,2101,2103,2105,2108,2110,2112,2114,2117,2119,2122,2124,2126,2128,2131],{"class":512,"line":591},[510,2072,2073],{"class":594},"    attributes",[510,2075,598],{"class":520},[510,2077,1265],{"class":520},[510,2079,2080],{"class":594}," method",[510,2082,598],{"class":520},[510,2084,1918],{"class":527},[510,2086,924],{"class":520},[510,2088,2089],{"class":527},"method",[510,2091,687],{"class":520},[510,2093,2094],{"class":594}," path",[510,2096,598],{"class":520},[510,2098,1918],{"class":527},[510,2100,924],{"class":520},[510,2102,1942],{"class":527},[510,2104,687],{"class":520},[510,2106,2107],{"class":594}," status",[510,2109,598],{"class":520},[510,2111,1918],{"class":527},[510,2113,924],{"class":520},[510,2115,2116],{"class":527},"status",[510,2118,687],{"class":520},[510,2120,2121],{"class":594}," duration",[510,2123,598],{"class":520},[510,2125,1918],{"class":527},[510,2127,924],{"class":520},[510,2129,2130],{"class":527},"duration",[510,2132,762],{"class":520},[510,2134,2135,2137],{"class":512,"line":604},[510,2136,1157],{"class":520},[510,2138,1383],{"class":594},[510,2140,2141],{"class":512,"line":615},[510,2142,575],{"emptyLinePlaceholder":574},[510,2144,2145,2147],{"class":512,"line":626},[510,2146,813],{"class":516},[510,2148,521],{"class":520},[510,2150,2151,2154,2156,2158,2160,2162,2164,2166,2169,2171],{"class":512,"line":632},[510,2152,2153],{"class":594},"    url",[510,2155,598],{"class":520},[510,2157,1025],{"class":520},[510,2159,921],{"class":527},[510,2161,924],{"class":520},[510,2163,722],{"class":527},[510,2165,556],{"class":520},[510,2167,2168],{"class":565},"\u002Fv1\u002Fpush",[510,2170,1049],{"class":520},[510,2172,531],{"class":520},[510,2174,2175,2178,2180,2182,2184,2186,2188,2190,2192,2194,2196],{"class":512,"line":637},[510,2176,2177],{"class":594},"    headers",[510,2179,598],{"class":520},[510,2181,1265],{"class":520},[510,2183,562],{"class":520},[510,2185,1070],{"class":594},[510,2187,684],{"class":520},[510,2189,598],{"class":520},[510,2191,562],{"class":520},[510,2193,1079],{"class":565},[510,2195,684],{"class":520},[510,2197,762],{"class":520},[510,2199,2200,2203,2205,2207,2209,2211,2213,2216,2218],{"class":512,"line":668},[510,2201,2202],{"class":594},"    body",[510,2204,598],{"class":520},[510,2206,1128],{"class":527},[510,2208,924],{"class":520},[510,2210,1133],{"class":785},[510,2212,789],{"class":594},[510,2214,2215],{"class":527},"payload",[510,2217,1008],{"class":594},[510,2219,531],{"class":520},[510,2221,2222],{"class":512,"line":711},[510,2223,1595],{"class":520},[510,2225,2226],{"class":512,"line":746},[510,2227,629],{"class":520},[408,2229,2230,2231,2234,2235,2237],{},"Returning ",[411,2232,2233],{},"null"," from ",[411,2236,425],{}," is a clean opt-out — the drain stays a no-op for that batch.",[485,2239,2241,2242],{"id":2240},"when-you-cant-use-definehttpdrain","When you can't use ",[411,2243,417],{},[408,2245,2246,2247,598],{},"If your destination requires a non-HTTP transport (gRPC, websocket, vendor SDK), drop one level lower with ",[411,2248,2249],{},"defineDrain",[500,2251,2253],{"className":502,"code":2252,"language":505,"meta":506,"style":506},"import { defineDrain, type DrainContext } 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",[411,2254,2255,2281,2285,2301,2323,2338,2379,2402,2438,2442],{"__ignoreMap":506},[510,2256,2257,2259,2261,2264,2266,2269,2271,2273,2275,2277,2279],{"class":512,"line":513},[510,2258,517],{"class":516},[510,2260,1265],{"class":520},[510,2262,2263],{"class":527}," defineDrain",[510,2265,687],{"class":520},[510,2267,2268],{"class":516}," type",[510,2270,1528],{"class":527},[510,2272,1271],{"class":520},[510,2274,559],{"class":516},[510,2276,562],{"class":520},[510,2278,413],{"class":565},[510,2280,568],{"class":520},[510,2282,2283],{"class":512,"line":524},[510,2284,575],{"emptyLinePlaceholder":574},[510,2286,2287,2289,2291,2294,2296,2298],{"class":512,"line":534},[510,2288,779],{"class":516},[510,2290,1291],{"class":581},[510,2292,2293],{"class":527}," createCustomTransportDrain ",[510,2295,662],{"class":520},[510,2297,857],{"class":520},[510,2299,2300],{"class":581}," =>\n",[510,2302,2303,2306,2309,2312,2314,2316,2319,2321],{"class":512,"line":542},[510,2304,2305],{"class":785},"  defineDrain",[510,2307,2308],{"class":520},"\u003C{",[510,2310,2311],{"class":594}," apiKey",[510,2313,598],{"class":520},[510,2315,1624],{"class":585},[510,2317,2318],{"class":520}," }>",[510,2320,789],{"class":527},[510,2322,827],{"class":520},[510,2324,2325,2327,2329,2331,2334,2336],{"class":512,"line":553},[510,2326,833],{"class":594},[510,2328,598],{"class":520},[510,2330,562],{"class":520},[510,2332,2333],{"class":565},"custom",[510,2335,684],{"class":520},[510,2337,531],{"class":520},[510,2339,2340,2342,2344,2346,2348,2350,2352,2354,2356,2358,2361,2363,2366,2368,2371,2373,2375,2377],{"class":512,"line":571},[510,2341,849],{"class":785},[510,2343,598],{"class":520},[510,2345,854],{"class":581},[510,2347,857],{"class":520},[510,2349,860],{"class":581},[510,2351,915],{"class":527},[510,2353,1375],{"class":520},[510,2355,2311],{"class":594},[510,2357,598],{"class":520},[510,2359,2360],{"class":527}," process",[510,2362,924],{"class":520},[510,2364,2365],{"class":527},"env",[510,2367,924],{"class":520},[510,2369,2370],{"class":527},"MY_KEY",[510,2372,918],{"class":520},[510,2374,1271],{"class":520},[510,2376,1008],{"class":527},[510,2378,531],{"class":520},[510,2380,2381,2384,2386,2388,2390,2392,2394,2396,2398,2400],{"class":512,"line":578},[510,2382,2383],{"class":785},"    send",[510,2385,598],{"class":520},[510,2387,854],{"class":581},[510,2389,915],{"class":520},[510,2391,1001],{"class":792},[510,2393,687],{"class":520},[510,2395,871],{"class":792},[510,2397,1008],{"class":520},[510,2399,860],{"class":581},[510,2401,521],{"class":520},[510,2403,2404,2407,2410,2412,2415,2417,2419,2421,2423,2426,2428,2430,2432,2434,2436],{"class":512,"line":591},[510,2405,2406],{"class":516},"      await",[510,2408,2409],{"class":527}," myVendorSdk",[510,2411,924],{"class":520},[510,2413,2414],{"class":785},"publish",[510,2416,789],{"class":594},[510,2418,1001],{"class":527},[510,2420,687],{"class":520},[510,2422,1265],{"class":520},[510,2424,2425],{"class":594}," token",[510,2427,598],{"class":520},[510,2429,871],{"class":527},[510,2431,924],{"class":520},[510,2433,681],{"class":527},[510,2435,1271],{"class":520},[510,2437,906],{"class":594},[510,2439,2440],{"class":512,"line":604},[510,2441,988],{"class":520},[510,2443,2444,2446],{"class":512,"line":615},[510,2445,1157],{"class":520},[510,2447,906],{"class":527},[408,2449,2450],{},"You still get config resolution, error isolation, and a consistent shape — you just own the wire transport.",[485,2452,2454],{"id":2453},"batching","Batching",[408,2456,2457,2458,2461],{},"For high-throughput scenarios, use the ",[474,2459,2460],{"href":369},"Drain Pipeline"," to batch events, retry on failure, and handle buffer overflow automatically:",[500,2463,2465],{"className":502,"code":2464,"filename":504,"language":505,"meta":506,"style":506},"import type { DrainContext } from 'evlog'\nimport { createDrainPipeline } from 'evlog\u002Fpipeline'\n\nconst pipeline = createDrainPipeline\u003CDrainContext>({\n  batch: { size: 100, intervalMs: 5000 },\n})\n\nconst drain = pipeline(async (batch) => {\n  await fetch('https:\u002F\u002Fapi.example.com\u002Flogs\u002Fbatch', {\n    method: 'POST',\n    body: JSON.stringify(batch.map(ctx => ctx.event)),\n  })\n})\n",[411,2466,2467,2487,2507,2511,2532,2561,2567,2571,2598,2619,2634,2674,2680],{"__ignoreMap":506},[510,2468,2469,2471,2473,2475,2477,2479,2481,2483,2485],{"class":512,"line":513},[510,2470,517],{"class":516},[510,2472,2268],{"class":516},[510,2474,1265],{"class":520},[510,2476,1528],{"class":527},[510,2478,1271],{"class":520},[510,2480,559],{"class":516},[510,2482,562],{"class":520},[510,2484,1370],{"class":565},[510,2486,568],{"class":520},[510,2488,2489,2491,2493,2496,2498,2500,2502,2505],{"class":512,"line":524},[510,2490,517],{"class":516},[510,2492,1265],{"class":520},[510,2494,2495],{"class":527}," createDrainPipeline",[510,2497,1271],{"class":520},[510,2499,559],{"class":516},[510,2501,562],{"class":520},[510,2503,2504],{"class":565},"evlog\u002Fpipeline",[510,2506,568],{"class":520},[510,2508,2509],{"class":512,"line":534},[510,2510,575],{"emptyLinePlaceholder":574},[510,2512,2513,2515,2518,2520,2522,2524,2526,2528,2530],{"class":512,"line":542},[510,2514,640],{"class":581},[510,2516,2517],{"class":527}," pipeline ",[510,2519,662],{"class":520},[510,2521,2495],{"class":785},[510,2523,650],{"class":520},[510,2525,432],{"class":585},[510,2527,656],{"class":520},[510,2529,789],{"class":527},[510,2531,827],{"class":520},[510,2533,2534,2537,2539,2541,2544,2546,2549,2551,2554,2556,2559],{"class":512,"line":553},[510,2535,2536],{"class":594},"  batch",[510,2538,598],{"class":520},[510,2540,1265],{"class":520},[510,2542,2543],{"class":594}," size",[510,2545,598],{"class":520},[510,2547,2548],{"class":1974}," 100",[510,2550,687],{"class":520},[510,2552,2553],{"class":594}," intervalMs",[510,2555,598],{"class":520},[510,2557,2558],{"class":1974}," 5000",[510,2560,762],{"class":520},[510,2562,2563,2565],{"class":512,"line":571},[510,2564,556],{"class":520},[510,2566,906],{"class":527},[510,2568,2569],{"class":512,"line":578},[510,2570,575],{"emptyLinePlaceholder":574},[510,2572,2573,2575,2577,2579,2582,2584,2587,2589,2592,2594,2596],{"class":512,"line":591},[510,2574,640],{"class":581},[510,2576,1378],{"class":527},[510,2578,662],{"class":520},[510,2580,2581],{"class":785}," pipeline",[510,2583,789],{"class":527},[510,2585,2586],{"class":581},"async",[510,2588,915],{"class":520},[510,2590,2591],{"class":792},"batch",[510,2593,1008],{"class":520},[510,2595,860],{"class":581},[510,2597,521],{"class":520},[510,2599,2600,2603,2606,2608,2610,2613,2615,2617],{"class":512,"line":604},[510,2601,2602],{"class":516},"  await",[510,2604,2605],{"class":785}," fetch",[510,2607,789],{"class":594},[510,2609,684],{"class":520},[510,2611,2612],{"class":565},"https:\u002F\u002Fapi.example.com\u002Flogs\u002Fbatch",[510,2614,684],{"class":520},[510,2616,687],{"class":520},[510,2618,521],{"class":520},[510,2620,2621,2623,2625,2627,2630,2632],{"class":512,"line":615},[510,2622,1568],{"class":594},[510,2624,598],{"class":520},[510,2626,562],{"class":520},[510,2628,2629],{"class":565},"POST",[510,2631,684],{"class":520},[510,2633,531],{"class":520},[510,2635,2636,2638,2640,2642,2644,2646,2648,2650,2652,2654,2656,2659,2661,2664,2666,2669,2672],{"class":512,"line":626},[510,2637,2202],{"class":594},[510,2639,598],{"class":520},[510,2641,1128],{"class":527},[510,2643,924],{"class":520},[510,2645,1133],{"class":785},[510,2647,789],{"class":594},[510,2649,2591],{"class":527},[510,2651,924],{"class":520},[510,2653,2002],{"class":785},[510,2655,789],{"class":594},[510,2657,2658],{"class":792},"ctx",[510,2660,860],{"class":581},[510,2662,2663],{"class":527}," ctx",[510,2665,924],{"class":520},[510,2667,2668],{"class":527},"event",[510,2670,2671],{"class":594},"))",[510,2673,531],{"class":520},[510,2675,2676,2678],{"class":512,"line":632},[510,2677,1157],{"class":520},[510,2679,906],{"class":594},[510,2681,2682,2684],{"class":512,"line":637},[510,2683,556],{"class":520},[510,2685,906],{"class":527},[2687,2688,2690,2691,2694],"callout",{"color":1675,"icon":2689},"i-lucide-arrow-right","See the ",[474,2692,2693],{"href":369},"Pipeline documentation"," for the full options reference, retry strategies, and buffer overflow handling.",[485,2696,2698],{"id":2697},"error-handling-already-done-for-you","Error Handling — already done for you",[408,2700,2701,2703],{},[411,2702,417],{}," enforces every best practice automatically:",[1788,2705,2706,2717,2727,2735],{},[449,2707,2708,2712,2713,2716],{},[2709,2710,2711],"strong",{},"Never throws"," — failures are caught and logged with the ",[411,2714,2715],{},"[evlog\u002F\u003Cname>]"," prefix.",[449,2718,2719,2722,2723,2726],{},[2709,2720,2721],{},"Retries"," — defaults to 2 attempts on transient errors (configurable via ",[411,2724,2725],{},"retries",").",[449,2728,2729,2732,2733,2726],{},[2709,2730,2731],{},"Timeouts"," — defaults to 5000ms (configurable via ",[411,2734,757],{},[449,2736,2737,2740,2741,2743,2744,2746],{},[2709,2738,2739],{},"Graceful degradation"," — ",[411,2742,421],{}," returning ",[411,2745,2233],{}," makes the drain a no-op.",[408,2748,2749,2750,2752,2753,2756,2757,2760],{},"If you fall back to ",[411,2751,2249],{}," for non-HTTP transports, follow the same rules manually — wrap the transport in ",[411,2754,2755],{},"try\u002Fcatch",", log with ",[411,2758,2759],{},"console.error('[evlog\u002F\u003Cname>] …')",", and never re-throw.",[485,2762,2764],{"id":2763},"next-steps","Next Steps",[446,2766,2767,2773,2779,2785],{},[449,2768,2769,2772],{},[474,2770,2771],{"href":314},"Axiom Adapter"," - See a production-ready adapter implementation",[449,2774,2775,2778],{},[474,2776,2777],{"href":319},"OTLP Adapter"," - OpenTelemetry Protocol adapter",[449,2780,2781,2784],{},[474,2782,2783],{"href":324},"PostHog Adapter"," - PostHog product analytics adapter",[449,2786,2787,2789],{},[474,2788,185],{"href":186}," - Security and production tips",[2791,2792,2793],"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 .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}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":506,"searchDepth":524,"depth":524,"links":2795},[2796,2798,2799,2800,2801,2803,2804,2805],{"id":487,"depth":524,"text":2797},"Recipe — defineHttpDrain in 15 lines",{"id":1514,"depth":524,"text":1515},{"id":1779,"depth":524,"text":1780},{"id":1854,"depth":524,"text":1855},{"id":2240,"depth":524,"text":2802},"When you can't use defineHttpDrain",{"id":2453,"depth":524,"text":2454},{"id":2697,"depth":524,"text":2698},{"id":2763,"depth":524,"text":2764},"Build your own adapter to send logs to any destination using defineHttpDrain — config resolution, retries, timeouts, and error handling are handled for you.","md",[2809,2812],{"label":2771,"icon":316,"to":314,"color":2810,"variant":2811},"neutral","subtle",{"label":185,"icon":129,"to":186,"color":2810,"variant":2811},{},{"icon":83},{"title":378,"description":2806},"y3SEJzJOQWr98KRcRYbmwenqorLQM3z7gyQP-04pMtM",[2818,2820],{"title":373,"path":374,"stem":375,"description":2819,"icon":376,"children":-1},"Framework-agnostic HTTP log transport for sending client-side logs to your server via fetch or sendBeacon. Works in the browser or any environment with fetch. Use the `evlog\u002Fhttp` entry point.",{"title":382,"path":383,"stem":384,"description":2821,"icon":385,"children":-1},"The evlog\u002Ftoolkit public API — every primitive used to build adapters, enrichers, plugins, and framework integrations.",1778325972243]