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