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