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