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