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