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