[{"data":1,"prerenderedAt":2545},["ShallowReactive",2],{"navigation_docs":3,"-adapters-building-blocks-pipeline":407,"-adapters-building-blocks-pipeline-surround":2540},[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":409,"body":410,"description":2529,"extension":2530,"links":2531,"meta":2536,"navigation":2537,"path":374,"seo":2538,"stem":375,"__hash__":2539},"docs\u002F6.adapters\u002F04.building-blocks\u002F01.pipeline.md","Drain Pipeline",{"type":411,"value":412,"toc":2517},"minimark",[413,417,465,469,472,1341,1361,1365,1368,1394,1397,1407,1729,1734,1877,1881,1936,1940,1947,2007,2011,2014,2224,2228,2231,2476,2491,2495,2513],[414,415,416],"p",{},"In production, sending one HTTP request per log event is wasteful. The drain pipeline buffers events and sends them in batches, retries on transient failures, and drops the oldest events when the buffer overflows.",[418,419,422,425,451],"prompt",{":actions":420,"description":421,"icon":376},"[\"copy\",\"cursor\",\"windsurf\"]","Add the drain pipeline (batch + retry + fan-out)",[414,423,424],{},"Wrap my evlog drain in the shared pipeline (batch + retry + buffer overflow protection).",[426,427,428,432,435,442,445,448],"ul",{},[429,430,431],"li",{},"Identify my framework and follow its evlog wiring pattern",[429,433,434],{},"Import createDrainPipeline from 'evlog\u002Fpipeline' and the adapter (e.g. evlog\u002Faxiom)",[429,436,437,438],{},"Wrap the adapter: const drain = createDrainPipeline",[439,440,441],"drain-context",{},"()(createAxiomDrain())",[429,443,444],{},"Configure batch ({ size, intervalMs }), retry ({ maxAttempts, backoff }), and bufferSize options",[429,446,447],{},"Use fan-out to send to multiple drains at once: pipeline(...adapters)",[429,449,450],{},"Hook drain.flush() on framework close \u002F SIGTERM so buffered events aren't lost on shutdown",[414,452,453,454,460,461],{},"Docs: ",[455,456,457],"a",{"href":457,"rel":458},"https:\u002F\u002Fwww.evlog.dev\u002Fadapters\u002Fbuilding-blocks\u002Fpipeline",[459],"nofollow","\nAdapters: ",[455,462,463],{"href":463,"rel":464},"https:\u002F\u002Fwww.evlog.dev\u002Fadapters\u002Foverview",[459],[466,467,20],"h2",{"id":468},"quick-start",[414,470,471],{},"The pipeline wraps any drain. The wiring depends on your framework — pick the tab that matches yours; every other example below uses the same shape.",[473,474,475,744,981,1177],"code-group",{},[476,477,483],"pre",{"className":478,"code":479,"filename":480,"language":481,"meta":482,"style":482},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F server\u002Fplugins\u002Fevlog-drain.ts\nimport type { DrainContext } from 'evlog'\nimport { createDrainPipeline } from 'evlog\u002Fpipeline'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\n\nexport default defineNitroPlugin((nitroApp) => {\n  const pipeline = createDrainPipeline\u003CDrainContext>()\n  const drain = pipeline(createAxiomDrain())\n\n  nitroApp.hooks.hook('evlog:drain', drain)\n  nitroApp.hooks.hook('close', () => drain.flush())\n})\n","Nuxt \u002F Nitro","typescript","",[484,485,486,495,529,550,571,578,610,638,658,663,698,736],"code",{"__ignoreMap":482},[487,488,491],"span",{"class":489,"line":490},"line",1,[487,492,494],{"class":493},"sHwdD","\u002F\u002F server\u002Fplugins\u002Fevlog-drain.ts\n",[487,496,498,502,505,509,513,516,519,522,526],{"class":489,"line":497},2,[487,499,501],{"class":500},"s7zQu","import",[487,503,504],{"class":500}," type",[487,506,508],{"class":507},"sMK4o"," {",[487,510,512],{"class":511},"sTEyZ"," DrainContext",[487,514,515],{"class":507}," }",[487,517,518],{"class":500}," from",[487,520,521],{"class":507}," '",[487,523,525],{"class":524},"sfazB","evlog",[487,527,528],{"class":507},"'\n",[487,530,532,534,536,539,541,543,545,548],{"class":489,"line":531},3,[487,533,501],{"class":500},[487,535,508],{"class":507},[487,537,538],{"class":511}," createDrainPipeline",[487,540,515],{"class":507},[487,542,518],{"class":500},[487,544,521],{"class":507},[487,546,547],{"class":524},"evlog\u002Fpipeline",[487,549,528],{"class":507},[487,551,553,555,557,560,562,564,566,569],{"class":489,"line":552},4,[487,554,501],{"class":500},[487,556,508],{"class":507},[487,558,559],{"class":511}," createAxiomDrain",[487,561,515],{"class":507},[487,563,518],{"class":500},[487,565,521],{"class":507},[487,567,568],{"class":524},"evlog\u002Faxiom",[487,570,528],{"class":507},[487,572,574],{"class":489,"line":573},5,[487,575,577],{"emptyLinePlaceholder":576},true,"\n",[487,579,581,584,587,591,594,596,600,603,607],{"class":489,"line":580},6,[487,582,583],{"class":500},"export",[487,585,586],{"class":500}," default",[487,588,590],{"class":589},"s2Zo4"," defineNitroPlugin",[487,592,593],{"class":511},"(",[487,595,593],{"class":507},[487,597,599],{"class":598},"sHdIc","nitroApp",[487,601,602],{"class":507},")",[487,604,606],{"class":605},"spNyl"," =>",[487,608,609],{"class":507}," {\n",[487,611,613,616,619,622,624,627,631,634],{"class":489,"line":612},7,[487,614,615],{"class":605},"  const",[487,617,618],{"class":511}," pipeline",[487,620,621],{"class":507}," =",[487,623,538],{"class":589},[487,625,626],{"class":507},"\u003C",[487,628,630],{"class":629},"sBMFI","DrainContext",[487,632,633],{"class":507},">",[487,635,637],{"class":636},"swJcz","()\n",[487,639,641,643,646,648,650,652,655],{"class":489,"line":640},8,[487,642,615],{"class":605},[487,644,645],{"class":511}," drain",[487,647,621],{"class":507},[487,649,618],{"class":589},[487,651,593],{"class":636},[487,653,654],{"class":589},"createAxiomDrain",[487,656,657],{"class":636},"())\n",[487,659,661],{"class":489,"line":660},9,[487,662,577],{"emptyLinePlaceholder":576},[487,664,666,669,672,675,677,680,682,685,688,690,693,695],{"class":489,"line":665},10,[487,667,668],{"class":511},"  nitroApp",[487,670,671],{"class":507},".",[487,673,674],{"class":511},"hooks",[487,676,671],{"class":507},[487,678,679],{"class":589},"hook",[487,681,593],{"class":636},[487,683,684],{"class":507},"'",[487,686,687],{"class":524},"evlog:drain",[487,689,684],{"class":507},[487,691,692],{"class":507},",",[487,694,645],{"class":511},[487,696,697],{"class":636},")\n",[487,699,701,703,705,707,709,711,713,715,718,720,722,725,727,729,731,734],{"class":489,"line":700},11,[487,702,668],{"class":511},[487,704,671],{"class":507},[487,706,674],{"class":511},[487,708,671],{"class":507},[487,710,679],{"class":589},[487,712,593],{"class":636},[487,714,684],{"class":507},[487,716,717],{"class":524},"close",[487,719,684],{"class":507},[487,721,692],{"class":507},[487,723,724],{"class":507}," ()",[487,726,606],{"class":605},[487,728,645],{"class":511},[487,730,671],{"class":507},[487,732,733],{"class":589},"flush",[487,735,657],{"class":636},[487,737,739,742],{"class":489,"line":738},12,[487,740,741],{"class":507},"}",[487,743,697],{"class":511},[476,745,747],{"className":478,"code":746,"filename":216,"language":481,"meta":482,"style":482},"\u002F\u002F lib\u002Fevlog.ts\nimport type { DrainContext } from 'evlog'\nimport { createEvlog } from 'evlog\u002Fnext'\nimport { createDrainPipeline } from 'evlog\u002Fpipeline'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\n\nconst pipeline = createDrainPipeline\u003CDrainContext>()\nconst drain = pipeline(createAxiomDrain())\n\nexport const { withEvlog, useLogger, log, createError } = createEvlog({\n  service: 'my-app',\n  drain,\n})\n\n\u002F\u002F Flush before shutdown (e.g. from your custom server or a teardown hook)\nexport const flushEvlog = () => drain.flush()\n",[484,748,749,754,774,794,812,830,834,855,872,876,914,932,939,946,951,957],{"__ignoreMap":482},[487,750,751],{"class":489,"line":490},[487,752,753],{"class":493},"\u002F\u002F lib\u002Fevlog.ts\n",[487,755,756,758,760,762,764,766,768,770,772],{"class":489,"line":497},[487,757,501],{"class":500},[487,759,504],{"class":500},[487,761,508],{"class":507},[487,763,512],{"class":511},[487,765,515],{"class":507},[487,767,518],{"class":500},[487,769,521],{"class":507},[487,771,525],{"class":524},[487,773,528],{"class":507},[487,775,776,778,780,783,785,787,789,792],{"class":489,"line":531},[487,777,501],{"class":500},[487,779,508],{"class":507},[487,781,782],{"class":511}," createEvlog",[487,784,515],{"class":507},[487,786,518],{"class":500},[487,788,521],{"class":507},[487,790,791],{"class":524},"evlog\u002Fnext",[487,793,528],{"class":507},[487,795,796,798,800,802,804,806,808,810],{"class":489,"line":552},[487,797,501],{"class":500},[487,799,508],{"class":507},[487,801,538],{"class":511},[487,803,515],{"class":507},[487,805,518],{"class":500},[487,807,521],{"class":507},[487,809,547],{"class":524},[487,811,528],{"class":507},[487,813,814,816,818,820,822,824,826,828],{"class":489,"line":573},[487,815,501],{"class":500},[487,817,508],{"class":507},[487,819,559],{"class":511},[487,821,515],{"class":507},[487,823,518],{"class":500},[487,825,521],{"class":507},[487,827,568],{"class":524},[487,829,528],{"class":507},[487,831,832],{"class":489,"line":580},[487,833,577],{"emptyLinePlaceholder":576},[487,835,836,839,842,845,847,849,851,853],{"class":489,"line":612},[487,837,838],{"class":605},"const",[487,840,841],{"class":511}," pipeline ",[487,843,844],{"class":507},"=",[487,846,538],{"class":589},[487,848,626],{"class":507},[487,850,630],{"class":629},[487,852,633],{"class":507},[487,854,637],{"class":511},[487,856,857,859,862,864,866,868,870],{"class":489,"line":640},[487,858,838],{"class":605},[487,860,861],{"class":511}," drain ",[487,863,844],{"class":507},[487,865,618],{"class":589},[487,867,593],{"class":511},[487,869,654],{"class":589},[487,871,657],{"class":511},[487,873,874],{"class":489,"line":660},[487,875,577],{"emptyLinePlaceholder":576},[487,877,878,880,883,885,888,890,893,895,898,900,903,905,907,909,911],{"class":489,"line":665},[487,879,583],{"class":500},[487,881,882],{"class":605}," const",[487,884,508],{"class":507},[487,886,887],{"class":511}," withEvlog",[487,889,692],{"class":507},[487,891,892],{"class":511}," useLogger",[487,894,692],{"class":507},[487,896,897],{"class":511}," log",[487,899,692],{"class":507},[487,901,902],{"class":511}," createError ",[487,904,741],{"class":507},[487,906,621],{"class":507},[487,908,782],{"class":589},[487,910,593],{"class":511},[487,912,913],{"class":507},"{\n",[487,915,916,919,922,924,927,929],{"class":489,"line":700},[487,917,918],{"class":636},"  service",[487,920,921],{"class":507},":",[487,923,521],{"class":507},[487,925,926],{"class":524},"my-app",[487,928,684],{"class":507},[487,930,931],{"class":507},",\n",[487,933,934,937],{"class":489,"line":738},[487,935,936],{"class":511},"  drain",[487,938,931],{"class":507},[487,940,942,944],{"class":489,"line":941},13,[487,943,741],{"class":507},[487,945,697],{"class":511},[487,947,949],{"class":489,"line":948},14,[487,950,577],{"emptyLinePlaceholder":576},[487,952,954],{"class":489,"line":953},15,[487,955,956],{"class":493},"\u002F\u002F Flush before shutdown (e.g. from your custom server or a teardown hook)\n",[487,958,960,962,964,967,969,971,973,975,977,979],{"class":489,"line":959},16,[487,961,583],{"class":500},[487,963,882],{"class":605},[487,965,966],{"class":511}," flushEvlog ",[487,968,844],{"class":507},[487,970,724],{"class":507},[487,972,606],{"class":605},[487,974,645],{"class":511},[487,976,671],{"class":507},[487,978,733],{"class":589},[487,980,637],{"class":511},[476,982,985],{"className":478,"code":983,"filename":984,"language":481,"meta":482,"style":482},"\u002F\u002F Same pattern — pass `drain` to the framework's evlog middleware\u002Fmodule\nimport type { DrainContext } from 'evlog'\nimport { createDrainPipeline } from 'evlog\u002Fpipeline'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\n\nconst pipeline = createDrainPipeline\u003CDrainContext>()\nconst drain = pipeline(createAxiomDrain())\n\napp.use(evlog({ drain })) \u002F\u002F Hono \u002F Express \u002F Elysia\n\u002F\u002F await app.register(evlog, { drain }) \u002F\u002F Fastify\n\u002F\u002F EvlogModule.forRoot({ drain }) \u002F\u002F NestJS\n\n\u002F\u002F Flush on shutdown\nprocess.on('SIGTERM', () => drain.flush())\n","Hono \u002F Express \u002F Fastify \u002F Elysia \u002F NestJS",[484,986,987,992,1012,1030,1048,1052,1070,1086,1090,1119,1127,1135,1139,1144],{"__ignoreMap":482},[487,988,989],{"class":489,"line":490},[487,990,991],{"class":493},"\u002F\u002F Same pattern — pass `drain` to the framework's evlog middleware\u002Fmodule\n",[487,993,994,996,998,1000,1002,1004,1006,1008,1010],{"class":489,"line":497},[487,995,501],{"class":500},[487,997,504],{"class":500},[487,999,508],{"class":507},[487,1001,512],{"class":511},[487,1003,515],{"class":507},[487,1005,518],{"class":500},[487,1007,521],{"class":507},[487,1009,525],{"class":524},[487,1011,528],{"class":507},[487,1013,1014,1016,1018,1020,1022,1024,1026,1028],{"class":489,"line":531},[487,1015,501],{"class":500},[487,1017,508],{"class":507},[487,1019,538],{"class":511},[487,1021,515],{"class":507},[487,1023,518],{"class":500},[487,1025,521],{"class":507},[487,1027,547],{"class":524},[487,1029,528],{"class":507},[487,1031,1032,1034,1036,1038,1040,1042,1044,1046],{"class":489,"line":552},[487,1033,501],{"class":500},[487,1035,508],{"class":507},[487,1037,559],{"class":511},[487,1039,515],{"class":507},[487,1041,518],{"class":500},[487,1043,521],{"class":507},[487,1045,568],{"class":524},[487,1047,528],{"class":507},[487,1049,1050],{"class":489,"line":573},[487,1051,577],{"emptyLinePlaceholder":576},[487,1053,1054,1056,1058,1060,1062,1064,1066,1068],{"class":489,"line":580},[487,1055,838],{"class":605},[487,1057,841],{"class":511},[487,1059,844],{"class":507},[487,1061,538],{"class":589},[487,1063,626],{"class":507},[487,1065,630],{"class":629},[487,1067,633],{"class":507},[487,1069,637],{"class":511},[487,1071,1072,1074,1076,1078,1080,1082,1084],{"class":489,"line":612},[487,1073,838],{"class":605},[487,1075,861],{"class":511},[487,1077,844],{"class":507},[487,1079,618],{"class":589},[487,1081,593],{"class":511},[487,1083,654],{"class":589},[487,1085,657],{"class":511},[487,1087,1088],{"class":489,"line":640},[487,1089,577],{"emptyLinePlaceholder":576},[487,1091,1092,1095,1097,1100,1102,1104,1106,1109,1111,1113,1116],{"class":489,"line":660},[487,1093,1094],{"class":511},"app",[487,1096,671],{"class":507},[487,1098,1099],{"class":589},"use",[487,1101,593],{"class":511},[487,1103,525],{"class":589},[487,1105,593],{"class":511},[487,1107,1108],{"class":507},"{",[487,1110,861],{"class":511},[487,1112,741],{"class":507},[487,1114,1115],{"class":511},")) ",[487,1117,1118],{"class":493},"\u002F\u002F Hono \u002F Express \u002F Elysia\n",[487,1120,1121,1124],{"class":489,"line":665},[487,1122,1123],{"class":493},"\u002F\u002F await app.register(evlog, { drain })",[487,1125,1126],{"class":493}," \u002F\u002F Fastify\n",[487,1128,1129,1132],{"class":489,"line":700},[487,1130,1131],{"class":493},"\u002F\u002F EvlogModule.forRoot({ drain })",[487,1133,1134],{"class":493}," \u002F\u002F NestJS\n",[487,1136,1137],{"class":489,"line":738},[487,1138,577],{"emptyLinePlaceholder":576},[487,1140,1141],{"class":489,"line":941},[487,1142,1143],{"class":493},"\u002F\u002F Flush on shutdown\n",[487,1145,1146,1149,1151,1154,1156,1158,1161,1163,1165,1167,1169,1171,1173,1175],{"class":489,"line":948},[487,1147,1148],{"class":511},"process",[487,1150,671],{"class":507},[487,1152,1153],{"class":589},"on",[487,1155,593],{"class":511},[487,1157,684],{"class":507},[487,1159,1160],{"class":524},"SIGTERM",[487,1162,684],{"class":507},[487,1164,692],{"class":507},[487,1166,724],{"class":507},[487,1168,606],{"class":605},[487,1170,645],{"class":511},[487,1172,671],{"class":507},[487,1174,733],{"class":589},[487,1176,657],{"class":511},[476,1178,1180],{"className":478,"code":1179,"filename":271,"language":481,"meta":482,"style":482},"\u002F\u002F index.ts — plain TypeScript \u002F Bun \u002F Node script\nimport type { DrainContext } from 'evlog'\nimport { initLogger } from 'evlog'\nimport { createDrainPipeline } from 'evlog\u002Fpipeline'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\n\nconst pipeline = createDrainPipeline\u003CDrainContext>()\nconst drain = pipeline(createAxiomDrain())\n\ninitLogger({ drain })\n\n\u002F\u002F Flush before exit\nawait drain.flush()\n",[484,1181,1182,1187,1207,1226,1244,1262,1266,1284,1300,1304,1319,1323,1328],{"__ignoreMap":482},[487,1183,1184],{"class":489,"line":490},[487,1185,1186],{"class":493},"\u002F\u002F index.ts — plain TypeScript \u002F Bun \u002F Node script\n",[487,1188,1189,1191,1193,1195,1197,1199,1201,1203,1205],{"class":489,"line":497},[487,1190,501],{"class":500},[487,1192,504],{"class":500},[487,1194,508],{"class":507},[487,1196,512],{"class":511},[487,1198,515],{"class":507},[487,1200,518],{"class":500},[487,1202,521],{"class":507},[487,1204,525],{"class":524},[487,1206,528],{"class":507},[487,1208,1209,1211,1213,1216,1218,1220,1222,1224],{"class":489,"line":531},[487,1210,501],{"class":500},[487,1212,508],{"class":507},[487,1214,1215],{"class":511}," initLogger",[487,1217,515],{"class":507},[487,1219,518],{"class":500},[487,1221,521],{"class":507},[487,1223,525],{"class":524},[487,1225,528],{"class":507},[487,1227,1228,1230,1232,1234,1236,1238,1240,1242],{"class":489,"line":552},[487,1229,501],{"class":500},[487,1231,508],{"class":507},[487,1233,538],{"class":511},[487,1235,515],{"class":507},[487,1237,518],{"class":500},[487,1239,521],{"class":507},[487,1241,547],{"class":524},[487,1243,528],{"class":507},[487,1245,1246,1248,1250,1252,1254,1256,1258,1260],{"class":489,"line":573},[487,1247,501],{"class":500},[487,1249,508],{"class":507},[487,1251,559],{"class":511},[487,1253,515],{"class":507},[487,1255,518],{"class":500},[487,1257,521],{"class":507},[487,1259,568],{"class":524},[487,1261,528],{"class":507},[487,1263,1264],{"class":489,"line":580},[487,1265,577],{"emptyLinePlaceholder":576},[487,1267,1268,1270,1272,1274,1276,1278,1280,1282],{"class":489,"line":612},[487,1269,838],{"class":605},[487,1271,841],{"class":511},[487,1273,844],{"class":507},[487,1275,538],{"class":589},[487,1277,626],{"class":507},[487,1279,630],{"class":629},[487,1281,633],{"class":507},[487,1283,637],{"class":511},[487,1285,1286,1288,1290,1292,1294,1296,1298],{"class":489,"line":640},[487,1287,838],{"class":605},[487,1289,861],{"class":511},[487,1291,844],{"class":507},[487,1293,618],{"class":589},[487,1295,593],{"class":511},[487,1297,654],{"class":589},[487,1299,657],{"class":511},[487,1301,1302],{"class":489,"line":660},[487,1303,577],{"emptyLinePlaceholder":576},[487,1305,1306,1309,1311,1313,1315,1317],{"class":489,"line":665},[487,1307,1308],{"class":589},"initLogger",[487,1310,593],{"class":511},[487,1312,1108],{"class":507},[487,1314,861],{"class":511},[487,1316,741],{"class":507},[487,1318,697],{"class":511},[487,1320,1321],{"class":489,"line":700},[487,1322,577],{"emptyLinePlaceholder":576},[487,1324,1325],{"class":489,"line":738},[487,1326,1327],{"class":493},"\u002F\u002F Flush before exit\n",[487,1329,1330,1333,1335,1337,1339],{"class":489,"line":941},[487,1331,1332],{"class":500},"await",[487,1334,645],{"class":511},[487,1336,671],{"class":507},[487,1338,733],{"class":589},[487,1340,637],{"class":511},[1342,1343,1346,1347,1350,1351,1353,1354,1357,1358,671],"callout",{"color":1344,"icon":1345},"warning","i-lucide-alert-triangle","Always flush the pipeline before the process exits (",[484,1348,1349],{},"drain.flush()","). On Nitro use the ",[484,1352,717],{}," hook; on standalone scripts call it before ",[484,1355,1356],{},"process.exit","; on serverless runtimes use ",[484,1359,1360],{},"waitUntil(drain.flush())",[466,1362,1364],{"id":1363},"how-it-works","How It Works",[1366,1367],"drain-pipeline-batching",{},[414,1369,1370,1371,1373,1374,1377,1378,1381,1382,1385,1386,1389,1390,1393],{},"Events are buffered as they arrive on ",[484,1372,687],{},". A batch flushes when either ",[484,1375,1376],{},"batch.size"," is reached or ",[484,1379,1380],{},"batch.intervalMs"," expires (whichever comes first). On failure, the same batch is retried with the configured backoff; once ",[484,1383,1384],{},"retry.maxAttempts"," is exhausted, ",[484,1387,1388],{},"onDropped"," is called with the lost events. The buffer is bounded by ",[484,1391,1392],{},"maxBufferSize"," — once full, the oldest events are dropped to keep memory flat.",[466,1395,170],{"id":1396},"configuration",[414,1398,1399,1400,1403,1404,671],{},"The options below apply to any framework — wire the resulting ",[484,1401,1402],{},"drain"," the same way you did in ",[455,1405,20],{"href":1406},"#quick-start",[476,1408,1411],{"className":478,"code":1409,"filename":1410,"language":481,"meta":482,"style":482},"import type { DrainContext } from 'evlog'\nimport { createDrainPipeline } from 'evlog\u002Fpipeline'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\n\nconst pipeline = createDrainPipeline\u003CDrainContext>({\n  batch: {\n    size: 50,          \u002F\u002F Flush every 50 events\n    intervalMs: 5000,  \u002F\u002F Or every 5 seconds, whichever comes first\n  },\n  retry: {\n    maxAttempts: 3,\n    backoff: 'exponential',\n    initialDelayMs: 1000,\n    maxDelayMs: 30000,\n  },\n  maxBufferSize: 1000,\n  onDropped: (events, error) => {\n    console.error(`[evlog] Dropped ${events.length} events:`, error?.message)\n  },\n})\n\nexport const drain = pipeline(createAxiomDrain())\n\u002F\u002F Then wire `drain` to your framework — see Quick Start above.\n","pipeline-config.ts",[484,1412,1413,1433,1451,1469,1473,1493,1502,1518,1533,1538,1547,1559,1575,1587,1599,1603,1614,1639,1687,1692,1699,1704,1723],{"__ignoreMap":482},[487,1414,1415,1417,1419,1421,1423,1425,1427,1429,1431],{"class":489,"line":490},[487,1416,501],{"class":500},[487,1418,504],{"class":500},[487,1420,508],{"class":507},[487,1422,512],{"class":511},[487,1424,515],{"class":507},[487,1426,518],{"class":500},[487,1428,521],{"class":507},[487,1430,525],{"class":524},[487,1432,528],{"class":507},[487,1434,1435,1437,1439,1441,1443,1445,1447,1449],{"class":489,"line":497},[487,1436,501],{"class":500},[487,1438,508],{"class":507},[487,1440,538],{"class":511},[487,1442,515],{"class":507},[487,1444,518],{"class":500},[487,1446,521],{"class":507},[487,1448,547],{"class":524},[487,1450,528],{"class":507},[487,1452,1453,1455,1457,1459,1461,1463,1465,1467],{"class":489,"line":531},[487,1454,501],{"class":500},[487,1456,508],{"class":507},[487,1458,559],{"class":511},[487,1460,515],{"class":507},[487,1462,518],{"class":500},[487,1464,521],{"class":507},[487,1466,568],{"class":524},[487,1468,528],{"class":507},[487,1470,1471],{"class":489,"line":552},[487,1472,577],{"emptyLinePlaceholder":576},[487,1474,1475,1477,1479,1481,1483,1485,1487,1489,1491],{"class":489,"line":573},[487,1476,838],{"class":605},[487,1478,841],{"class":511},[487,1480,844],{"class":507},[487,1482,538],{"class":589},[487,1484,626],{"class":507},[487,1486,630],{"class":629},[487,1488,633],{"class":507},[487,1490,593],{"class":511},[487,1492,913],{"class":507},[487,1494,1495,1498,1500],{"class":489,"line":580},[487,1496,1497],{"class":636},"  batch",[487,1499,921],{"class":507},[487,1501,609],{"class":507},[487,1503,1504,1507,1509,1513,1515],{"class":489,"line":612},[487,1505,1506],{"class":636},"    size",[487,1508,921],{"class":507},[487,1510,1512],{"class":1511},"sbssI"," 50",[487,1514,692],{"class":507},[487,1516,1517],{"class":493},"          \u002F\u002F Flush every 50 events\n",[487,1519,1520,1523,1525,1528,1530],{"class":489,"line":640},[487,1521,1522],{"class":636},"    intervalMs",[487,1524,921],{"class":507},[487,1526,1527],{"class":1511}," 5000",[487,1529,692],{"class":507},[487,1531,1532],{"class":493},"  \u002F\u002F Or every 5 seconds, whichever comes first\n",[487,1534,1535],{"class":489,"line":660},[487,1536,1537],{"class":507},"  },\n",[487,1539,1540,1543,1545],{"class":489,"line":665},[487,1541,1542],{"class":636},"  retry",[487,1544,921],{"class":507},[487,1546,609],{"class":507},[487,1548,1549,1552,1554,1557],{"class":489,"line":700},[487,1550,1551],{"class":636},"    maxAttempts",[487,1553,921],{"class":507},[487,1555,1556],{"class":1511}," 3",[487,1558,931],{"class":507},[487,1560,1561,1564,1566,1568,1571,1573],{"class":489,"line":738},[487,1562,1563],{"class":636},"    backoff",[487,1565,921],{"class":507},[487,1567,521],{"class":507},[487,1569,1570],{"class":524},"exponential",[487,1572,684],{"class":507},[487,1574,931],{"class":507},[487,1576,1577,1580,1582,1585],{"class":489,"line":941},[487,1578,1579],{"class":636},"    initialDelayMs",[487,1581,921],{"class":507},[487,1583,1584],{"class":1511}," 1000",[487,1586,931],{"class":507},[487,1588,1589,1592,1594,1597],{"class":489,"line":948},[487,1590,1591],{"class":636},"    maxDelayMs",[487,1593,921],{"class":507},[487,1595,1596],{"class":1511}," 30000",[487,1598,931],{"class":507},[487,1600,1601],{"class":489,"line":953},[487,1602,1537],{"class":507},[487,1604,1605,1608,1610,1612],{"class":489,"line":959},[487,1606,1607],{"class":636},"  maxBufferSize",[487,1609,921],{"class":507},[487,1611,1584],{"class":1511},[487,1613,931],{"class":507},[487,1615,1617,1620,1622,1625,1628,1630,1633,1635,1637],{"class":489,"line":1616},17,[487,1618,1619],{"class":589},"  onDropped",[487,1621,921],{"class":507},[487,1623,1624],{"class":507}," (",[487,1626,1627],{"class":598},"events",[487,1629,692],{"class":507},[487,1631,1632],{"class":598}," error",[487,1634,602],{"class":507},[487,1636,606],{"class":605},[487,1638,609],{"class":507},[487,1640,1642,1645,1647,1650,1652,1655,1658,1661,1663,1665,1668,1670,1673,1675,1677,1679,1682,1685],{"class":489,"line":1641},18,[487,1643,1644],{"class":511},"    console",[487,1646,671],{"class":507},[487,1648,1649],{"class":589},"error",[487,1651,593],{"class":636},[487,1653,1654],{"class":507},"`",[487,1656,1657],{"class":524},"[evlog] Dropped ",[487,1659,1660],{"class":507},"${",[487,1662,1627],{"class":511},[487,1664,671],{"class":507},[487,1666,1667],{"class":511},"length",[487,1669,741],{"class":507},[487,1671,1672],{"class":524}," events:",[487,1674,1654],{"class":507},[487,1676,692],{"class":507},[487,1678,1632],{"class":511},[487,1680,1681],{"class":507},"?.",[487,1683,1684],{"class":511},"message",[487,1686,697],{"class":636},[487,1688,1690],{"class":489,"line":1689},19,[487,1691,1537],{"class":507},[487,1693,1695,1697],{"class":489,"line":1694},20,[487,1696,741],{"class":507},[487,1698,697],{"class":511},[487,1700,1702],{"class":489,"line":1701},21,[487,1703,577],{"emptyLinePlaceholder":576},[487,1705,1707,1709,1711,1713,1715,1717,1719,1721],{"class":489,"line":1706},22,[487,1708,583],{"class":500},[487,1710,882],{"class":605},[487,1712,861],{"class":511},[487,1714,844],{"class":507},[487,1716,618],{"class":589},[487,1718,593],{"class":511},[487,1720,654],{"class":589},[487,1722,657],{"class":511},[487,1724,1726],{"class":489,"line":1725},23,[487,1727,1728],{"class":493},"\u002F\u002F Then wire `drain` to your framework — see Quick Start above.\n",[1730,1731,1733],"h3",{"id":1732},"options-reference","Options Reference",[1735,1736,1737,1753],"table",{},[1738,1739,1740],"thead",{},[1741,1742,1743,1747,1750],"tr",{},[1744,1745,1746],"th",{},"Option",[1744,1748,1749],{},"Default",[1744,1751,1752],{},"Description",[1754,1755,1756,1771,1785,1799,1822,1837,1852,1865],"tbody",{},[1741,1757,1758,1763,1768],{},[1759,1760,1761],"td",{},[484,1762,1376],{},[1759,1764,1765],{},[484,1766,1767],{},"50",[1759,1769,1770],{},"Maximum events per batch",[1741,1772,1773,1777,1782],{},[1759,1774,1775],{},[484,1776,1380],{},[1759,1778,1779],{},[484,1780,1781],{},"5000",[1759,1783,1784],{},"Max time (ms) before flushing a partial batch",[1741,1786,1787,1791,1796],{},[1759,1788,1789],{},[484,1790,1384],{},[1759,1792,1793],{},[484,1794,1795],{},"3",[1759,1797,1798],{},"Total attempts including the initial one",[1741,1800,1801,1806,1811],{},[1759,1802,1803],{},[484,1804,1805],{},"retry.backoff",[1759,1807,1808],{},[484,1809,1810],{},"'exponential'",[1759,1812,1813,1815,1816,1815,1819],{},[484,1814,1810],{}," | ",[484,1817,1818],{},"'linear'",[484,1820,1821],{},"'fixed'",[1741,1823,1824,1829,1834],{},[1759,1825,1826],{},[484,1827,1828],{},"retry.initialDelayMs",[1759,1830,1831],{},[484,1832,1833],{},"1000",[1759,1835,1836],{},"Base delay for the first retry",[1741,1838,1839,1844,1849],{},[1759,1840,1841],{},[484,1842,1843],{},"retry.maxDelayMs",[1759,1845,1846],{},[484,1847,1848],{},"30000",[1759,1850,1851],{},"Upper bound for any retry delay",[1741,1853,1854,1858,1862],{},[1759,1855,1856],{},[484,1857,1392],{},[1759,1859,1860],{},[484,1861,1833],{},[1759,1863,1864],{},"Max buffered events before dropping oldest",[1741,1866,1867,1871,1874],{},[1759,1868,1869],{},[484,1870,1388],{},[1759,1872,1873],{},"-",[1759,1875,1876],{},"Callback when events are dropped (overflow or retry exhaustion)",[466,1878,1880],{"id":1879},"backoff-strategies","Backoff Strategies",[1735,1882,1883,1896],{},[1738,1884,1885],{},[1741,1886,1887,1890,1893],{},[1744,1888,1889],{},"Strategy",[1744,1891,1892],{},"Delay Pattern",[1744,1894,1895],{},"Use Case",[1754,1897,1898,1910,1923],{},[1741,1899,1900,1904,1907],{},[1759,1901,1902],{},[484,1903,1570],{},[1759,1905,1906],{},"1s, 2s, 4s, 8s...",[1759,1908,1909],{},"Default. Best for transient failures that may need time to recover",[1741,1911,1912,1917,1920],{},[1759,1913,1914],{},[484,1915,1916],{},"linear",[1759,1918,1919],{},"1s, 2s, 3s, 4s...",[1759,1921,1922],{},"Predictable delay growth",[1741,1924,1925,1930,1933],{},[1759,1926,1927],{},[484,1928,1929],{},"fixed",[1759,1931,1932],{},"1s, 1s, 1s, 1s...",[1759,1934,1935],{},"Same delay every time. Useful for rate-limited APIs",[466,1937,1939],{"id":1938},"returned-drain-function","Returned Drain Function",[414,1941,1942,1943,1946],{},"The function returned by ",[484,1944,1945],{},"pipeline(drain)"," is hook-compatible and exposes:",[1735,1948,1949,1961],{},[1738,1950,1951],{},[1741,1952,1953,1956,1959],{},[1744,1954,1955],{},"Property",[1744,1957,1958],{},"Type",[1744,1960,1752],{},[1754,1962,1963,1978,1992],{},[1741,1964,1965,1970,1975],{},[1759,1966,1967],{},[484,1968,1969],{},"drain(ctx)",[1759,1971,1972],{},[484,1973,1974],{},"(ctx: T) => void",[1759,1976,1977],{},"Push a single event into the buffer",[1741,1979,1980,1984,1989],{},[1759,1981,1982],{},[484,1983,1349],{},[1759,1985,1986],{},[484,1987,1988],{},"() => Promise\u003Cvoid>",[1759,1990,1991],{},"Force-flush all buffered events",[1741,1993,1994,1999,2004],{},[1759,1995,1996],{},[484,1997,1998],{},"drain.pending",[1759,2000,2001],{},[484,2002,2003],{},"number",[1759,2005,2006],{},"Number of events currently buffered",[466,2008,2010],{"id":2009},"multiple-destinations","Multiple Destinations",[414,2012,2013],{},"Wrap multiple adapters with a single pipeline (one batch flushed in parallel to every destination):",[476,2015,2018],{"className":478,"code":2016,"filename":2017,"language":481,"meta":482,"style":482},"import type { DrainContext } from 'evlog'\nimport { createDrainPipeline } from 'evlog\u002Fpipeline'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\nimport { createOTLPDrain } from 'evlog\u002Fotlp'\n\nconst axiom = createAxiomDrain()\nconst otlp = createOTLPDrain()\n\nconst pipeline = createDrainPipeline\u003CDrainContext>()\nexport const drain = pipeline(async (batch) => {\n  await Promise.allSettled([axiom(batch), otlp(batch)])\n})\n\u002F\u002F Wire `drain` exactly like in Quick Start — Nitro hook, framework middleware, or initLogger.\n","pipeline-fan-out.ts",[484,2019,2020,2040,2058,2076,2096,2100,2113,2126,2130,2148,2176,2213,2219],{"__ignoreMap":482},[487,2021,2022,2024,2026,2028,2030,2032,2034,2036,2038],{"class":489,"line":490},[487,2023,501],{"class":500},[487,2025,504],{"class":500},[487,2027,508],{"class":507},[487,2029,512],{"class":511},[487,2031,515],{"class":507},[487,2033,518],{"class":500},[487,2035,521],{"class":507},[487,2037,525],{"class":524},[487,2039,528],{"class":507},[487,2041,2042,2044,2046,2048,2050,2052,2054,2056],{"class":489,"line":497},[487,2043,501],{"class":500},[487,2045,508],{"class":507},[487,2047,538],{"class":511},[487,2049,515],{"class":507},[487,2051,518],{"class":500},[487,2053,521],{"class":507},[487,2055,547],{"class":524},[487,2057,528],{"class":507},[487,2059,2060,2062,2064,2066,2068,2070,2072,2074],{"class":489,"line":531},[487,2061,501],{"class":500},[487,2063,508],{"class":507},[487,2065,559],{"class":511},[487,2067,515],{"class":507},[487,2069,518],{"class":500},[487,2071,521],{"class":507},[487,2073,568],{"class":524},[487,2075,528],{"class":507},[487,2077,2078,2080,2082,2085,2087,2089,2091,2094],{"class":489,"line":552},[487,2079,501],{"class":500},[487,2081,508],{"class":507},[487,2083,2084],{"class":511}," createOTLPDrain",[487,2086,515],{"class":507},[487,2088,518],{"class":500},[487,2090,521],{"class":507},[487,2092,2093],{"class":524},"evlog\u002Fotlp",[487,2095,528],{"class":507},[487,2097,2098],{"class":489,"line":573},[487,2099,577],{"emptyLinePlaceholder":576},[487,2101,2102,2104,2107,2109,2111],{"class":489,"line":580},[487,2103,838],{"class":605},[487,2105,2106],{"class":511}," axiom ",[487,2108,844],{"class":507},[487,2110,559],{"class":589},[487,2112,637],{"class":511},[487,2114,2115,2117,2120,2122,2124],{"class":489,"line":612},[487,2116,838],{"class":605},[487,2118,2119],{"class":511}," otlp ",[487,2121,844],{"class":507},[487,2123,2084],{"class":589},[487,2125,637],{"class":511},[487,2127,2128],{"class":489,"line":640},[487,2129,577],{"emptyLinePlaceholder":576},[487,2131,2132,2134,2136,2138,2140,2142,2144,2146],{"class":489,"line":660},[487,2133,838],{"class":605},[487,2135,841],{"class":511},[487,2137,844],{"class":507},[487,2139,538],{"class":589},[487,2141,626],{"class":507},[487,2143,630],{"class":629},[487,2145,633],{"class":507},[487,2147,637],{"class":511},[487,2149,2150,2152,2154,2156,2158,2160,2162,2165,2167,2170,2172,2174],{"class":489,"line":665},[487,2151,583],{"class":500},[487,2153,882],{"class":605},[487,2155,861],{"class":511},[487,2157,844],{"class":507},[487,2159,618],{"class":589},[487,2161,593],{"class":511},[487,2163,2164],{"class":605},"async",[487,2166,1624],{"class":507},[487,2168,2169],{"class":598},"batch",[487,2171,602],{"class":507},[487,2173,606],{"class":605},[487,2175,609],{"class":507},[487,2177,2178,2181,2184,2186,2189,2192,2195,2197,2199,2201,2203,2206,2208,2210],{"class":489,"line":700},[487,2179,2180],{"class":500},"  await",[487,2182,2183],{"class":629}," Promise",[487,2185,671],{"class":507},[487,2187,2188],{"class":589},"allSettled",[487,2190,2191],{"class":636},"([",[487,2193,2194],{"class":589},"axiom",[487,2196,593],{"class":636},[487,2198,2169],{"class":511},[487,2200,602],{"class":636},[487,2202,692],{"class":507},[487,2204,2205],{"class":589}," otlp",[487,2207,593],{"class":636},[487,2209,2169],{"class":511},[487,2211,2212],{"class":636},")])\n",[487,2214,2215,2217],{"class":489,"line":738},[487,2216,741],{"class":507},[487,2218,697],{"class":511},[487,2220,2221],{"class":489,"line":941},[487,2222,2223],{"class":493},"\u002F\u002F Wire `drain` exactly like in Quick Start — Nitro hook, framework middleware, or initLogger.\n",[466,2225,2227],{"id":2226},"custom-drain-function","Custom Drain Function",[414,2229,2230],{},"You don't need an adapter. Pass any async function that accepts a batch:",[476,2232,2235],{"className":478,"code":2233,"filename":2234,"language":481,"meta":482,"style":482},"import type { DrainContext } from 'evlog'\nimport { createDrainPipeline } from 'evlog\u002Fpipeline'\n\nconst pipeline = createDrainPipeline\u003CDrainContext>({ batch: { size: 100 } })\n\nexport const drain = pipeline(async (batch) => {\n  await fetch('https:\u002F\u002Fyour-service.com\u002Flogs', {\n    method: 'POST',\n    headers: { 'Content-Type': 'application\u002Fjson' },\n    body: JSON.stringify(batch.map(ctx => ctx.event)),\n  })\n})\n\u002F\u002F Wire `drain` to your framework — see Quick Start above.\n","pipeline-custom.ts",[484,2236,2237,2257,2275,2279,2320,2324,2350,2370,2386,2414,2458,2465,2471],{"__ignoreMap":482},[487,2238,2239,2241,2243,2245,2247,2249,2251,2253,2255],{"class":489,"line":490},[487,2240,501],{"class":500},[487,2242,504],{"class":500},[487,2244,508],{"class":507},[487,2246,512],{"class":511},[487,2248,515],{"class":507},[487,2250,518],{"class":500},[487,2252,521],{"class":507},[487,2254,525],{"class":524},[487,2256,528],{"class":507},[487,2258,2259,2261,2263,2265,2267,2269,2271,2273],{"class":489,"line":497},[487,2260,501],{"class":500},[487,2262,508],{"class":507},[487,2264,538],{"class":511},[487,2266,515],{"class":507},[487,2268,518],{"class":500},[487,2270,521],{"class":507},[487,2272,547],{"class":524},[487,2274,528],{"class":507},[487,2276,2277],{"class":489,"line":531},[487,2278,577],{"emptyLinePlaceholder":576},[487,2280,2281,2283,2285,2287,2289,2291,2293,2295,2297,2299,2302,2304,2306,2309,2311,2314,2316,2318],{"class":489,"line":552},[487,2282,838],{"class":605},[487,2284,841],{"class":511},[487,2286,844],{"class":507},[487,2288,538],{"class":589},[487,2290,626],{"class":507},[487,2292,630],{"class":629},[487,2294,633],{"class":507},[487,2296,593],{"class":511},[487,2298,1108],{"class":507},[487,2300,2301],{"class":636}," batch",[487,2303,921],{"class":507},[487,2305,508],{"class":507},[487,2307,2308],{"class":636}," size",[487,2310,921],{"class":507},[487,2312,2313],{"class":1511}," 100",[487,2315,515],{"class":507},[487,2317,515],{"class":507},[487,2319,697],{"class":511},[487,2321,2322],{"class":489,"line":573},[487,2323,577],{"emptyLinePlaceholder":576},[487,2325,2326,2328,2330,2332,2334,2336,2338,2340,2342,2344,2346,2348],{"class":489,"line":580},[487,2327,583],{"class":500},[487,2329,882],{"class":605},[487,2331,861],{"class":511},[487,2333,844],{"class":507},[487,2335,618],{"class":589},[487,2337,593],{"class":511},[487,2339,2164],{"class":605},[487,2341,1624],{"class":507},[487,2343,2169],{"class":598},[487,2345,602],{"class":507},[487,2347,606],{"class":605},[487,2349,609],{"class":507},[487,2351,2352,2354,2357,2359,2361,2364,2366,2368],{"class":489,"line":612},[487,2353,2180],{"class":500},[487,2355,2356],{"class":589}," fetch",[487,2358,593],{"class":636},[487,2360,684],{"class":507},[487,2362,2363],{"class":524},"https:\u002F\u002Fyour-service.com\u002Flogs",[487,2365,684],{"class":507},[487,2367,692],{"class":507},[487,2369,609],{"class":507},[487,2371,2372,2375,2377,2379,2382,2384],{"class":489,"line":640},[487,2373,2374],{"class":636},"    method",[487,2376,921],{"class":507},[487,2378,521],{"class":507},[487,2380,2381],{"class":524},"POST",[487,2383,684],{"class":507},[487,2385,931],{"class":507},[487,2387,2388,2391,2393,2395,2397,2400,2402,2404,2406,2409,2411],{"class":489,"line":660},[487,2389,2390],{"class":636},"    headers",[487,2392,921],{"class":507},[487,2394,508],{"class":507},[487,2396,521],{"class":507},[487,2398,2399],{"class":636},"Content-Type",[487,2401,684],{"class":507},[487,2403,921],{"class":507},[487,2405,521],{"class":507},[487,2407,2408],{"class":524},"application\u002Fjson",[487,2410,684],{"class":507},[487,2412,2413],{"class":507}," },\n",[487,2415,2416,2419,2421,2424,2426,2429,2431,2433,2435,2438,2440,2443,2445,2448,2450,2453,2456],{"class":489,"line":665},[487,2417,2418],{"class":636},"    body",[487,2420,921],{"class":507},[487,2422,2423],{"class":511}," JSON",[487,2425,671],{"class":507},[487,2427,2428],{"class":589},"stringify",[487,2430,593],{"class":636},[487,2432,2169],{"class":511},[487,2434,671],{"class":507},[487,2436,2437],{"class":589},"map",[487,2439,593],{"class":636},[487,2441,2442],{"class":598},"ctx",[487,2444,606],{"class":605},[487,2446,2447],{"class":511}," ctx",[487,2449,671],{"class":507},[487,2451,2452],{"class":511},"event",[487,2454,2455],{"class":636},"))",[487,2457,931],{"class":507},[487,2459,2460,2463],{"class":489,"line":700},[487,2461,2462],{"class":507},"  }",[487,2464,697],{"class":636},[487,2466,2467,2469],{"class":489,"line":738},[487,2468,741],{"class":507},[487,2470,697],{"class":511},[487,2472,2473],{"class":489,"line":941},[487,2474,2475],{"class":493},"\u002F\u002F Wire `drain` to your framework — see Quick Start above.\n",[1342,2477,2480,2481,2486,2487,2490],{"color":2478,"icon":2479},"neutral","i-lucide-arrow-right","See the full ",[455,2482,2485],{"href":2483,"rel":2484},"https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog\u002Ftree\u002Fmain\u002Fexamples\u002Fbun-script",[459],"bun-script example"," for a complete working script using the standalone wiring, and the ",[455,2488,2489],{"href":217},"Next.js guide"," for an App Router implementation.",[466,2492,2494],{"id":2493},"next-steps","Next Steps",[426,2496,2497,2503,2508],{},[429,2498,2499,2502],{},[455,2500,2501],{"href":310},"Adapters Overview"," - Available built-in adapters",[429,2504,2505,2507],{},[455,2506,383],{"href":384}," - Build your own drain function",[429,2509,2510,2512],{},[455,2511,185],{"href":186}," - Security and production tips",[2514,2515,2516],"style",{},"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 .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 .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 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 .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":482,"searchDepth":497,"depth":497,"links":2518},[2519,2520,2521,2524,2525,2526,2527,2528],{"id":468,"depth":497,"text":20},{"id":1363,"depth":497,"text":1364},{"id":1396,"depth":497,"text":170,"children":2522},[2523],{"id":1732,"depth":531,"text":1733},{"id":1879,"depth":497,"text":1880},{"id":1938,"depth":497,"text":1939},{"id":2009,"depth":497,"text":2010},{"id":2226,"depth":497,"text":2227},{"id":2493,"depth":497,"text":2494},"Batch events, retry on failure, and protect against buffer overflow with the shared drain pipeline. Supports fan-out to multiple adapters.","md",[2532,2535],{"label":2501,"icon":2533,"to":310,"color":2478,"variant":2534},"i-custom-plug","subtle",{"label":383,"icon":83,"to":384,"color":2478,"variant":2534},{},{"title":373,"icon":376},{"title":409,"description":2529},"gG46N0uOrC2VufBknI9D8R-To3R9xfm6lzdjyKVm_6c",[2541,2543],{"title":363,"path":364,"stem":365,"description":2542,"icon":366,"children":-1},"Self-hosted log retention for evlog using NuxtHub database storage. Store, query, and automatically clean up your structured logs with zero external dependencies.",{"title":378,"path":379,"stem":380,"description":2544,"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.",1778327135426]