[{"data":1,"prerenderedAt":4694},["ShallowReactive",2],{"navigation_docs":3,"-extend-drain-pipeline":500,"-extend-drain-pipeline-surround":4689},[4,30,80,118,283,415,470],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Start","\u002Fstart","1.start",[9,14,19,24],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fstart\u002Fintroduction","1.start\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Why start with evlog","\u002Fstart\u002Fwhy-evlog","1.start\u002F2.why-evlog","i-lucide-rocket",{"title":20,"path":21,"stem":22,"icon":23},"Installation","\u002Fstart\u002Finstallation","1.start\u002F3.installation","i-lucide-download",{"title":25,"path":26,"stem":27,"icon":28},"Quick Start","\u002Fstart\u002Fquick-start","1.start\u002F4.quick-start","i-lucide-zap",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"Learn","\u002Flearn","2.learn",[35,40,45,50,55,60,65,70,75],{"title":36,"path":37,"stem":38,"icon":39},"Overview","\u002Flearn\u002Foverview","2.learn\u002F0.overview","i-lucide-list",{"title":41,"path":42,"stem":43,"icon":44},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":46,"path":47,"stem":48,"icon":49},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":51,"path":52,"stem":53,"icon":54},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":56,"path":57,"stem":58,"icon":59},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F4.lifecycle","i-lucide-arrow-right-left",{"title":61,"path":62,"stem":63,"icon":64},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F5.sampling","i-lucide-filter",{"title":66,"path":67,"stem":68,"icon":69},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F6.redaction","i-lucide-eye-off",{"title":71,"path":72,"stem":73,"icon":74},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":76,"path":77,"stem":78,"icon":79},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F8.catalogs","i-lucide-book-open",{"title":81,"path":82,"stem":83,"children":84,"page":29},"CLI","\u002Fcli","3.cli",[85,88,93,98,103,108,113],{"title":36,"path":86,"stem":87,"icon":44},"\u002Fcli\u002Foverview","3.cli\u002F0.overview",{"title":89,"path":90,"stem":91,"icon":92},"map","\u002Fcli\u002Fmap","3.cli\u002F1.map","i-lucide-radar",{"title":94,"path":95,"stem":96,"icon":97},"Rules","\u002Fcli\u002Frules","3.cli\u002F2.rules","i-lucide-list-checks",{"title":99,"path":100,"stem":101,"icon":102},"Scoring","\u002Fcli\u002Fscoring","3.cli\u002F3.scoring","i-lucide-gauge",{"title":104,"path":105,"stem":106,"icon":107},"CI","\u002Fcli\u002Fci","3.cli\u002F4.ci","i-lucide-git-pull-request",{"title":109,"path":110,"stem":111,"icon":112},"doctor","\u002Fcli\u002Fdoctor","3.cli\u002F5.doctor","i-lucide-stethoscope",{"title":114,"path":115,"stem":116,"icon":117},"telemetry","\u002Fcli\u002Ftelemetry","3.cli\u002F6.telemetry","i-lucide-bar-chart-3",{"title":119,"path":120,"stem":121,"children":122,"page":29},"Integrate","\u002Fintegrate","4.integrate",[123,127,195],{"title":36,"path":124,"stem":125,"icon":126},"\u002Fintegrate\u002Foverview","4.integrate\u002F0.overview","i-lucide-plug",{"title":128,"path":129,"stem":130,"children":131,"page":29},"Adapters","\u002Fintegrate\u002Fadapters","4.integrate\u002Fadapters",[132,135,175],{"title":36,"path":133,"stem":134,"icon":39},"\u002Fintegrate\u002Fadapters\u002Foverview","4.integrate\u002Fadapters\u002F01.overview",{"title":136,"path":137,"stem":138,"children":139,"page":29},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","4.integrate\u002Fadapters\u002Fcloud",[140,145,150,155,160,165,170],{"title":141,"path":142,"stem":143,"icon":144},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","4.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":146,"path":147,"stem":148,"icon":149},"OTLP","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fotlp","4.integrate\u002Fadapters\u002Fcloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":151,"path":152,"stem":153,"icon":154},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","4.integrate\u002Fadapters\u002Fcloud\u002F03.posthog","i-simple-icons-posthog",{"title":156,"path":157,"stem":158,"icon":159},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","4.integrate\u002Fadapters\u002Fcloud\u002F04.sentry","i-simple-icons-sentry",{"title":161,"path":162,"stem":163,"icon":164},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","4.integrate\u002Fadapters\u002Fcloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":166,"path":167,"stem":168,"icon":169},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","4.integrate\u002Fadapters\u002Fcloud\u002F06.datadog","i-simple-icons-datadog",{"title":171,"path":172,"stem":173,"icon":174},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fhyperdx","4.integrate\u002Fadapters\u002Fcloud\u002F07.hyperdx","i-custom-hyperdx",{"title":176,"path":177,"stem":178,"children":179,"page":29},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","4.integrate\u002Fadapters\u002Fself-hosted",[180,185,190],{"title":181,"path":182,"stem":183,"icon":184},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":186,"path":187,"stem":188,"icon":189},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","4.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":191,"path":192,"stem":193,"icon":194},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":196,"path":197,"stem":198,"children":199,"page":29},"Frameworks","\u002Fintegrate\u002Fframeworks","4.integrate\u002Fframeworks",[200,204,209,214,219,224,229,234,239,244,249,254,259,264,268,273,278],{"title":36,"path":201,"stem":202,"icon":203},"\u002Fintegrate\u002Fframeworks\u002Foverview","4.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":205,"path":206,"stem":207,"icon":208},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","4.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":210,"path":211,"stem":212,"icon":213},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","4.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":215,"path":216,"stem":217,"icon":218},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","4.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":220,"path":221,"stem":222,"icon":223},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","4.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":225,"path":226,"stem":227,"icon":228},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","4.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":230,"path":231,"stem":232,"icon":233},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","4.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":235,"path":236,"stem":237,"icon":238},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","4.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":240,"path":241,"stem":242,"icon":243},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","4.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":245,"path":246,"stem":247,"icon":248},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","4.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":250,"path":251,"stem":252,"icon":253},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","4.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":255,"path":256,"stem":257,"icon":258},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","4.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":260,"path":261,"stem":262,"icon":263},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","4.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":265,"path":266,"stem":267,"icon":74},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","4.integrate\u002Fframeworks\u002F13.standalone",{"title":269,"path":270,"stem":271,"icon":272},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","4.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":274,"path":275,"stem":276,"icon":277},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","4.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":279,"path":280,"stem":281,"icon":282},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","4.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":284,"path":285,"stem":286,"children":287,"page":29},"Use Cases","\u002Fuse-cases","5.use-cases",[288,291,296,325,352,384,405,410],{"title":36,"path":289,"stem":290,"icon":97},"\u002Fuse-cases\u002Foverview","5.use-cases\u002F0.overview",{"title":292,"path":293,"stem":294,"icon":295},"Client Logging","\u002Fuse-cases\u002Fclient-logging","5.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":297,"icon":298,"path":299,"stem":300,"children":301,"page":29},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","5.use-cases\u002F2.ai-sdk",[302,305,310,315,320],{"title":36,"path":303,"stem":304,"icon":39},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","5.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":306,"path":307,"stem":308,"icon":309},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","5.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":311,"path":312,"stem":313,"icon":314},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","5.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":316,"path":317,"stem":318,"icon":319},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","5.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":321,"path":322,"stem":323,"icon":324},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","5.use-cases\u002F2.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":326,"icon":327,"path":328,"stem":329,"children":330,"page":29},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","5.use-cases\u002F3.better-auth",[331,334,339,344,348],{"title":36,"path":332,"stem":333,"icon":39},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","5.use-cases\u002F3.better-auth\u002F01.overview",{"title":335,"path":336,"stem":337,"icon":338},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","5.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":340,"path":341,"stem":342,"icon":343},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","5.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":345,"path":346,"stem":347,"icon":295},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","5.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":349,"path":350,"stem":351,"icon":102},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","5.use-cases\u002F3.better-auth\u002F05.performance",{"title":353,"icon":354,"path":355,"stem":356,"children":357,"page":29},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","5.use-cases\u002F4.audit",[358,361,366,371,376,380],{"title":36,"path":359,"stem":360,"icon":39},"\u002Fuse-cases\u002Faudit\u002Foverview","5.use-cases\u002F4.audit\u002F01.overview",{"title":362,"path":363,"stem":364,"icon":365},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","5.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":367,"path":368,"stem":369,"icon":370},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","5.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":372,"path":373,"stem":374,"icon":375},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","5.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":377,"path":378,"stem":379,"icon":354},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","5.use-cases\u002F4.audit\u002F05.compliance",{"title":381,"path":382,"stem":383,"icon":79},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","5.use-cases\u002F4.audit\u002F06.recipes",{"title":321,"icon":102,"path":385,"stem":386,"children":387,"page":29},"\u002Fuse-cases\u002Ftelemetry","5.use-cases\u002F4.telemetry",[388,391,396,401],{"title":36,"path":389,"stem":390,"icon":39},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","5.use-cases\u002F4.telemetry\u002F01.overview",{"title":392,"path":393,"stem":394,"icon":395},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","5.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":397,"path":398,"stem":399,"icon":400},"Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","5.use-cases\u002F4.telemetry\u002F03.ingest","i-lucide-server",{"title":402,"path":403,"stem":404,"icon":79},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","5.use-cases\u002F4.telemetry\u002F04.reference",{"title":406,"path":407,"stem":408,"icon":409},"Enrichers","\u002Fuse-cases\u002Fenrichers","5.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":411,"path":412,"stem":413,"icon":414},"eve","\u002Fuse-cases\u002Feve","5.use-cases\u002F5.eve","i-custom-eve",{"title":416,"path":417,"stem":418,"children":419,"page":29},"Extend","\u002Fextend","6.extend",[420,424,429,434,439,443,447,451,455,460,465],{"title":36,"path":421,"stem":422,"icon":423},"\u002Fextend\u002Foverview","6.extend\u002F0.overview","i-lucide-blocks",{"title":425,"path":426,"stem":427,"icon":428},"Stream","\u002Fextend\u002Fstream","6.extend\u002F1.stream","i-lucide-radio-tower",{"title":430,"path":431,"stem":432,"icon":433},"Custom framework","\u002Fextend\u002Fcustom-framework","6.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":435,"path":436,"stem":437,"icon":438},"FS reader","\u002Fextend\u002Ffs-reader","6.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":381,"path":440,"stem":441,"icon":442},"\u002Fextend\u002Fconsumer-recipes","6.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":444,"path":445,"stem":446,"icon":423},"Plugins","\u002Fextend\u002Fplugins","6.extend\u002F4.plugins",{"title":448,"path":449,"stem":450,"icon":409},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","6.extend\u002F5.custom-enrichers",{"title":452,"path":453,"stem":454,"icon":64},"Tail sampling","\u002Fextend\u002Ftail-sampling","6.extend\u002F6.tail-sampling",{"title":456,"path":457,"stem":458,"icon":459},"Identity headers","\u002Fextend\u002Fidentity-headers","6.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":461,"path":462,"stem":463,"icon":464},"Custom drains","\u002Fextend\u002Fcustom-drains","6.extend\u002F8.custom-drains","i-lucide-share-2",{"title":466,"path":467,"stem":468,"icon":469},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","6.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":402,"path":471,"stem":472,"children":473,"page":29},"\u002Freference","7.reference",[474,479,482,487,491,496],{"title":475,"path":476,"stem":477,"icon":478},"Configuration","\u002Freference\u002Fconfiguration","7.reference\u002F1.configuration","i-lucide-settings",{"title":349,"path":480,"stem":481,"icon":102},"\u002Freference\u002Fperformance","7.reference\u002F2.performance",{"title":483,"path":484,"stem":485,"icon":486},"Vite Plugin","\u002Freference\u002Fvite-plugin","7.reference\u002F3.vite-plugin","i-custom-vite",{"title":488,"path":489,"stem":490,"icon":354},"Best Practices","\u002Freference\u002Fbest-practices","7.reference\u002F4.best-practices",{"title":492,"path":493,"stem":494,"icon":495},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","7.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":497,"path":498,"stem":499,"icon":409},"Agent Skills","\u002Freference\u002Fagent-skills","7.reference\u002F6.agent-skills",{"id":501,"title":502,"body":503,"description":4678,"extension":4679,"links":4680,"meta":4685,"navigation":4686,"path":467,"seo":4687,"stem":468,"__hash__":4688},"docs\u002F6.extend\u002F9.drain-pipeline.md","Drain Pipeline",{"type":504,"value":505,"toc":4652},"minimark",[506,516,519,581,674,678,681,1529,1546,1550,1575,1578,1895,1900,2037,2041,2096,2100,2107,2167,2170,2173,2180,2250,2254,2675,2679,2702,2706,2709,2979,2985,2989,2992,3227,3236,3239,3254,3277,3338,3341,3497,3501,3543,3547,3554,3566,3747,3753,3756,3943,3947,3953,4062,4068,4131,4135,4148,4153,4157,4160,4251,4274,4278,4284,4567,4576,4580,4614,4618,4648],[507,508,509,510,515],"p",{},"In production, sending one HTTP request per emitted event doesn't scale. The drain pipeline buffers events and sends them in batches, retries on transient failures, drops the oldest events when the buffer overflows, and lets a single drain function fan out to several destinations in parallel. The same pipeline powers the ",[511,512,514],"a",{"href":513},"#http-drain-browser-to-server","HTTP browser drain"," used for client-side logs.",[517,518],"drain-pipeline-batching",{},[520,521,522,535],"table",{},[523,524,525],"thead",{},[526,527,528,532],"tr",{},[529,530,531],"th",{},"You want to…",[529,533,534],{},"See",[536,537,538,550,561,571],"tbody",{},[526,539,540,544],{},[541,542,543],"td",{},"Wrap any drain in batch + retry + buffer",[541,545,546],{},[511,547,549],{"href":548},"#quick-start","Quick start",[526,551,552,555],{},[541,553,554],{},"Send each event to several destinations in parallel",[541,556,557],{},[511,558,560],{"href":559},"#fanout","Fanout",[526,562,563,566],{},[541,564,565],{},"Ship browser logs to your server endpoint",[541,567,568],{},[511,569,570],{"href":513},"HTTP drain (browser to server)",[526,572,573,576],{},[541,574,575],{},"Tune batch size, retry strategy, buffer size",[541,577,578],{},[511,579,475],{"href":580},"#configuration",[582,583,586,589,661],"prompt",{":actions":584,"description":585,"icon":469},"[\"copy\",\"cursor\",\"claude\"]","Add the drain pipeline (batch + retry + fanout)",[507,587,588],{},"Wrap my evlog drain in the shared pipeline so it batches, retries, and survives transient failures.",[590,591,592,604,610,628,639,658],"ul",{},[593,594,595,596,600,601],"li",{},"Import ",[597,598,599],"code",{},"createDrainPipeline"," from ",[597,602,603],{},"evlog\u002Fpipeline",[593,605,606,607],{},"Wrap the underlying drain: ",[597,608,609],{},"const drain = createDrainPipeline\u003CDrainContext>()(createAxiomDrain())",[593,611,612,613,616,617,620,621,624,625],{},"Configure ",[597,614,615],{},"batch"," (size + intervalMs), ",[597,618,619],{},"retry"," (maxAttempts + backoff), and ",[597,622,623],{},"maxBufferSize"," (oldest events drop on overflow). Sane defaults: ",[597,626,627],{},"{ batch: { size: 50, intervalMs: 5000 }, retry: { maxAttempts: 3 } }",[593,629,630,631,634,635,638],{},"For multiple destinations, write a single drain function that fans out internally with ",[597,632,633],{},"Promise.allSettled([drainA(batch), drainB(batch)])"," and pass that to ",[597,636,637],{},"pipeline(...)"," — one shared buffer, one shared retry budget",[593,640,641,642,645,646,649,650,653,654,657],{},"On shutdown, call ",[597,643,644],{},"drain.flush()"," to push buffered events (frameworks with proper lifecycle do this automatically: Nitro ",[597,647,648],{},"close"," hook, Standalone before ",[597,651,652],{},"process.exit",", serverless via ",[597,655,656],{},"waitUntil(drain.flush())",")",[593,659,660],{},"Always use the pipeline in production — direct drains make one HTTP call per event and fall over fast",[507,662,663,664,669,670],{},"Docs: ",[511,665,666],{"href":666,"rel":667},"https:\u002F\u002Fwww.evlog.dev\u002Fextend\u002Fdrain-pipeline",[668],"nofollow","\nAdapters: ",[511,671,672],{"href":672,"rel":673},"https:\u002F\u002Fwww.evlog.dev\u002Fintegrate\u002Fadapters\u002Foverview",[668],[675,676,549],"h2",{"id":677},"quick-start",[507,679,680],{},"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.",[682,683,684,949,1180,1366],"code-group",{},[685,686,692],"pre",{"className":687,"code":688,"filename":689,"language":690,"meta":691,"style":691},"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","",[597,693,694,703,737,757,778,785,816,844,864,869,904,941],{"__ignoreMap":691},[695,696,699],"span",{"class":697,"line":698},"line",1,[695,700,702],{"class":701},"sHwdD","\u002F\u002F server\u002Fplugins\u002Fevlog-drain.ts\n",[695,704,706,710,713,717,721,724,727,730,734],{"class":697,"line":705},2,[695,707,709],{"class":708},"s7zQu","import",[695,711,712],{"class":708}," type",[695,714,716],{"class":715},"sMK4o"," {",[695,718,720],{"class":719},"sTEyZ"," DrainContext",[695,722,723],{"class":715}," }",[695,725,726],{"class":708}," from",[695,728,729],{"class":715}," '",[695,731,733],{"class":732},"sfazB","evlog",[695,735,736],{"class":715},"'\n",[695,738,740,742,744,747,749,751,753,755],{"class":697,"line":739},3,[695,741,709],{"class":708},[695,743,716],{"class":715},[695,745,746],{"class":719}," createDrainPipeline",[695,748,723],{"class":715},[695,750,726],{"class":708},[695,752,729],{"class":715},[695,754,603],{"class":732},[695,756,736],{"class":715},[695,758,760,762,764,767,769,771,773,776],{"class":697,"line":759},4,[695,761,709],{"class":708},[695,763,716],{"class":715},[695,765,766],{"class":719}," createAxiomDrain",[695,768,723],{"class":715},[695,770,726],{"class":708},[695,772,729],{"class":715},[695,774,775],{"class":732},"evlog\u002Faxiom",[695,777,736],{"class":715},[695,779,781],{"class":697,"line":780},5,[695,782,784],{"emptyLinePlaceholder":783},true,"\n",[695,786,788,791,794,798,801,803,807,809,813],{"class":697,"line":787},6,[695,789,790],{"class":708},"export",[695,792,793],{"class":708}," default",[695,795,797],{"class":796},"s2Zo4"," defineNitroPlugin",[695,799,800],{"class":719},"(",[695,802,800],{"class":715},[695,804,806],{"class":805},"sHdIc","nitroApp",[695,808,657],{"class":715},[695,810,812],{"class":811},"spNyl"," =>",[695,814,815],{"class":715}," {\n",[695,817,819,822,825,828,830,833,837,840],{"class":697,"line":818},7,[695,820,821],{"class":811},"  const",[695,823,824],{"class":719}," pipeline",[695,826,827],{"class":715}," =",[695,829,746],{"class":796},[695,831,832],{"class":715},"\u003C",[695,834,836],{"class":835},"sBMFI","DrainContext",[695,838,839],{"class":715},">",[695,841,843],{"class":842},"swJcz","()\n",[695,845,847,849,852,854,856,858,861],{"class":697,"line":846},8,[695,848,821],{"class":811},[695,850,851],{"class":719}," drain",[695,853,827],{"class":715},[695,855,824],{"class":796},[695,857,800],{"class":842},[695,859,860],{"class":796},"createAxiomDrain",[695,862,863],{"class":842},"())\n",[695,865,867],{"class":697,"line":866},9,[695,868,784],{"emptyLinePlaceholder":783},[695,870,872,875,878,881,883,886,888,891,894,896,899,901],{"class":697,"line":871},10,[695,873,874],{"class":719},"  nitroApp",[695,876,877],{"class":715},".",[695,879,880],{"class":719},"hooks",[695,882,877],{"class":715},[695,884,885],{"class":796},"hook",[695,887,800],{"class":842},[695,889,890],{"class":715},"'",[695,892,893],{"class":732},"evlog:drain",[695,895,890],{"class":715},[695,897,898],{"class":715},",",[695,900,851],{"class":719},[695,902,903],{"class":842},")\n",[695,905,907,909,911,913,915,917,919,921,923,925,927,930,932,934,936,939],{"class":697,"line":906},11,[695,908,874],{"class":719},[695,910,877],{"class":715},[695,912,880],{"class":719},[695,914,877],{"class":715},[695,916,885],{"class":796},[695,918,800],{"class":842},[695,920,890],{"class":715},[695,922,648],{"class":732},[695,924,890],{"class":715},[695,926,898],{"class":715},[695,928,929],{"class":715}," ()",[695,931,812],{"class":811},[695,933,851],{"class":719},[695,935,877],{"class":715},[695,937,938],{"class":796},"flush",[695,940,863],{"class":842},[695,942,944,947],{"class":697,"line":943},12,[695,945,946],{"class":715},"}",[695,948,903],{"class":719},[685,950,952],{"className":687,"code":951,"filename":210,"language":690,"meta":691,"style":691},"\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\nexport const flushEvlog = () => drain.flush()\n",[597,953,954,959,979,999,1017,1035,1039,1060,1077,1081,1119,1137,1144,1151,1156],{"__ignoreMap":691},[695,955,956],{"class":697,"line":698},[695,957,958],{"class":701},"\u002F\u002F lib\u002Fevlog.ts\n",[695,960,961,963,965,967,969,971,973,975,977],{"class":697,"line":705},[695,962,709],{"class":708},[695,964,712],{"class":708},[695,966,716],{"class":715},[695,968,720],{"class":719},[695,970,723],{"class":715},[695,972,726],{"class":708},[695,974,729],{"class":715},[695,976,733],{"class":732},[695,978,736],{"class":715},[695,980,981,983,985,988,990,992,994,997],{"class":697,"line":739},[695,982,709],{"class":708},[695,984,716],{"class":715},[695,986,987],{"class":719}," createEvlog",[695,989,723],{"class":715},[695,991,726],{"class":708},[695,993,729],{"class":715},[695,995,996],{"class":732},"evlog\u002Fnext",[695,998,736],{"class":715},[695,1000,1001,1003,1005,1007,1009,1011,1013,1015],{"class":697,"line":759},[695,1002,709],{"class":708},[695,1004,716],{"class":715},[695,1006,746],{"class":719},[695,1008,723],{"class":715},[695,1010,726],{"class":708},[695,1012,729],{"class":715},[695,1014,603],{"class":732},[695,1016,736],{"class":715},[695,1018,1019,1021,1023,1025,1027,1029,1031,1033],{"class":697,"line":780},[695,1020,709],{"class":708},[695,1022,716],{"class":715},[695,1024,766],{"class":719},[695,1026,723],{"class":715},[695,1028,726],{"class":708},[695,1030,729],{"class":715},[695,1032,775],{"class":732},[695,1034,736],{"class":715},[695,1036,1037],{"class":697,"line":787},[695,1038,784],{"emptyLinePlaceholder":783},[695,1040,1041,1044,1047,1050,1052,1054,1056,1058],{"class":697,"line":818},[695,1042,1043],{"class":811},"const",[695,1045,1046],{"class":719}," pipeline ",[695,1048,1049],{"class":715},"=",[695,1051,746],{"class":796},[695,1053,832],{"class":715},[695,1055,836],{"class":835},[695,1057,839],{"class":715},[695,1059,843],{"class":719},[695,1061,1062,1064,1067,1069,1071,1073,1075],{"class":697,"line":846},[695,1063,1043],{"class":811},[695,1065,1066],{"class":719}," drain ",[695,1068,1049],{"class":715},[695,1070,824],{"class":796},[695,1072,800],{"class":719},[695,1074,860],{"class":796},[695,1076,863],{"class":719},[695,1078,1079],{"class":697,"line":866},[695,1080,784],{"emptyLinePlaceholder":783},[695,1082,1083,1085,1088,1090,1093,1095,1098,1100,1103,1105,1108,1110,1112,1114,1116],{"class":697,"line":871},[695,1084,790],{"class":708},[695,1086,1087],{"class":811}," const",[695,1089,716],{"class":715},[695,1091,1092],{"class":719}," withEvlog",[695,1094,898],{"class":715},[695,1096,1097],{"class":719}," useLogger",[695,1099,898],{"class":715},[695,1101,1102],{"class":719}," log",[695,1104,898],{"class":715},[695,1106,1107],{"class":719}," createError ",[695,1109,946],{"class":715},[695,1111,827],{"class":715},[695,1113,987],{"class":796},[695,1115,800],{"class":719},[695,1117,1118],{"class":715},"{\n",[695,1120,1121,1124,1127,1129,1132,1134],{"class":697,"line":906},[695,1122,1123],{"class":842},"  service",[695,1125,1126],{"class":715},":",[695,1128,729],{"class":715},[695,1130,1131],{"class":732},"my-app",[695,1133,890],{"class":715},[695,1135,1136],{"class":715},",\n",[695,1138,1139,1142],{"class":697,"line":943},[695,1140,1141],{"class":719},"  drain",[695,1143,1136],{"class":715},[695,1145,1147,1149],{"class":697,"line":1146},13,[695,1148,946],{"class":715},[695,1150,903],{"class":719},[695,1152,1154],{"class":697,"line":1153},14,[695,1155,784],{"emptyLinePlaceholder":783},[695,1157,1159,1161,1163,1166,1168,1170,1172,1174,1176,1178],{"class":697,"line":1158},15,[695,1160,790],{"class":708},[695,1162,1087],{"class":811},[695,1164,1165],{"class":719}," flushEvlog ",[695,1167,1049],{"class":715},[695,1169,929],{"class":715},[695,1171,812],{"class":811},[695,1173,851],{"class":719},[695,1175,877],{"class":715},[695,1177,938],{"class":796},[695,1179,843],{"class":719},[685,1181,1184],{"className":687,"code":1182,"filename":1183,"language":690,"meta":691,"style":691},"import 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\nprocess.on('SIGTERM', () => drain.flush())\n","Hono \u002F Express \u002F Fastify \u002F Elysia \u002F NestJS",[597,1185,1186,1206,1224,1242,1246,1264,1280,1284,1313,1321,1329,1333],{"__ignoreMap":691},[695,1187,1188,1190,1192,1194,1196,1198,1200,1202,1204],{"class":697,"line":698},[695,1189,709],{"class":708},[695,1191,712],{"class":708},[695,1193,716],{"class":715},[695,1195,720],{"class":719},[695,1197,723],{"class":715},[695,1199,726],{"class":708},[695,1201,729],{"class":715},[695,1203,733],{"class":732},[695,1205,736],{"class":715},[695,1207,1208,1210,1212,1214,1216,1218,1220,1222],{"class":697,"line":705},[695,1209,709],{"class":708},[695,1211,716],{"class":715},[695,1213,746],{"class":719},[695,1215,723],{"class":715},[695,1217,726],{"class":708},[695,1219,729],{"class":715},[695,1221,603],{"class":732},[695,1223,736],{"class":715},[695,1225,1226,1228,1230,1232,1234,1236,1238,1240],{"class":697,"line":739},[695,1227,709],{"class":708},[695,1229,716],{"class":715},[695,1231,766],{"class":719},[695,1233,723],{"class":715},[695,1235,726],{"class":708},[695,1237,729],{"class":715},[695,1239,775],{"class":732},[695,1241,736],{"class":715},[695,1243,1244],{"class":697,"line":759},[695,1245,784],{"emptyLinePlaceholder":783},[695,1247,1248,1250,1252,1254,1256,1258,1260,1262],{"class":697,"line":780},[695,1249,1043],{"class":811},[695,1251,1046],{"class":719},[695,1253,1049],{"class":715},[695,1255,746],{"class":796},[695,1257,832],{"class":715},[695,1259,836],{"class":835},[695,1261,839],{"class":715},[695,1263,843],{"class":719},[695,1265,1266,1268,1270,1272,1274,1276,1278],{"class":697,"line":787},[695,1267,1043],{"class":811},[695,1269,1066],{"class":719},[695,1271,1049],{"class":715},[695,1273,824],{"class":796},[695,1275,800],{"class":719},[695,1277,860],{"class":796},[695,1279,863],{"class":719},[695,1281,1282],{"class":697,"line":818},[695,1283,784],{"emptyLinePlaceholder":783},[695,1285,1286,1289,1291,1294,1296,1298,1300,1303,1305,1307,1310],{"class":697,"line":846},[695,1287,1288],{"class":719},"app",[695,1290,877],{"class":715},[695,1292,1293],{"class":796},"use",[695,1295,800],{"class":719},[695,1297,733],{"class":796},[695,1299,800],{"class":719},[695,1301,1302],{"class":715},"{",[695,1304,1066],{"class":719},[695,1306,946],{"class":715},[695,1308,1309],{"class":719},")) ",[695,1311,1312],{"class":701},"\u002F\u002F Hono \u002F Express \u002F Elysia\n",[695,1314,1315,1318],{"class":697,"line":866},[695,1316,1317],{"class":701},"\u002F\u002F await app.register(evlog, { drain })",[695,1319,1320],{"class":701}," \u002F\u002F Fastify\n",[695,1322,1323,1326],{"class":697,"line":871},[695,1324,1325],{"class":701},"\u002F\u002F EvlogModule.forRoot({ drain })",[695,1327,1328],{"class":701}," \u002F\u002F NestJS\n",[695,1330,1331],{"class":697,"line":906},[695,1332,784],{"emptyLinePlaceholder":783},[695,1334,1335,1338,1340,1343,1345,1347,1350,1352,1354,1356,1358,1360,1362,1364],{"class":697,"line":943},[695,1336,1337],{"class":719},"process",[695,1339,877],{"class":715},[695,1341,1342],{"class":796},"on",[695,1344,800],{"class":719},[695,1346,890],{"class":715},[695,1348,1349],{"class":732},"SIGTERM",[695,1351,890],{"class":715},[695,1353,898],{"class":715},[695,1355,929],{"class":715},[695,1357,812],{"class":811},[695,1359,851],{"class":719},[695,1361,877],{"class":715},[695,1363,938],{"class":796},[695,1365,863],{"class":719},[685,1367,1369],{"className":687,"code":1368,"filename":265,"language":690,"meta":691,"style":691},"\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\nawait drain.flush() \u002F\u002F before exit\n",[597,1370,1371,1376,1396,1415,1433,1451,1455,1473,1489,1493,1508,1512],{"__ignoreMap":691},[695,1372,1373],{"class":697,"line":698},[695,1374,1375],{"class":701},"\u002F\u002F index.ts — plain TypeScript \u002F Bun \u002F Node script\n",[695,1377,1378,1380,1382,1384,1386,1388,1390,1392,1394],{"class":697,"line":705},[695,1379,709],{"class":708},[695,1381,712],{"class":708},[695,1383,716],{"class":715},[695,1385,720],{"class":719},[695,1387,723],{"class":715},[695,1389,726],{"class":708},[695,1391,729],{"class":715},[695,1393,733],{"class":732},[695,1395,736],{"class":715},[695,1397,1398,1400,1402,1405,1407,1409,1411,1413],{"class":697,"line":739},[695,1399,709],{"class":708},[695,1401,716],{"class":715},[695,1403,1404],{"class":719}," initLogger",[695,1406,723],{"class":715},[695,1408,726],{"class":708},[695,1410,729],{"class":715},[695,1412,733],{"class":732},[695,1414,736],{"class":715},[695,1416,1417,1419,1421,1423,1425,1427,1429,1431],{"class":697,"line":759},[695,1418,709],{"class":708},[695,1420,716],{"class":715},[695,1422,746],{"class":719},[695,1424,723],{"class":715},[695,1426,726],{"class":708},[695,1428,729],{"class":715},[695,1430,603],{"class":732},[695,1432,736],{"class":715},[695,1434,1435,1437,1439,1441,1443,1445,1447,1449],{"class":697,"line":780},[695,1436,709],{"class":708},[695,1438,716],{"class":715},[695,1440,766],{"class":719},[695,1442,723],{"class":715},[695,1444,726],{"class":708},[695,1446,729],{"class":715},[695,1448,775],{"class":732},[695,1450,736],{"class":715},[695,1452,1453],{"class":697,"line":787},[695,1454,784],{"emptyLinePlaceholder":783},[695,1456,1457,1459,1461,1463,1465,1467,1469,1471],{"class":697,"line":818},[695,1458,1043],{"class":811},[695,1460,1046],{"class":719},[695,1462,1049],{"class":715},[695,1464,746],{"class":796},[695,1466,832],{"class":715},[695,1468,836],{"class":835},[695,1470,839],{"class":715},[695,1472,843],{"class":719},[695,1474,1475,1477,1479,1481,1483,1485,1487],{"class":697,"line":846},[695,1476,1043],{"class":811},[695,1478,1066],{"class":719},[695,1480,1049],{"class":715},[695,1482,824],{"class":796},[695,1484,800],{"class":719},[695,1486,860],{"class":796},[695,1488,863],{"class":719},[695,1490,1491],{"class":697,"line":866},[695,1492,784],{"emptyLinePlaceholder":783},[695,1494,1495,1498,1500,1502,1504,1506],{"class":697,"line":871},[695,1496,1497],{"class":796},"initLogger",[695,1499,800],{"class":719},[695,1501,1302],{"class":715},[695,1503,1066],{"class":719},[695,1505,946],{"class":715},[695,1507,903],{"class":719},[695,1509,1510],{"class":697,"line":906},[695,1511,784],{"emptyLinePlaceholder":783},[695,1513,1514,1517,1519,1521,1523,1526],{"class":697,"line":943},[695,1515,1516],{"class":708},"await",[695,1518,851],{"class":719},[695,1520,877],{"class":715},[695,1522,938],{"class":796},[695,1524,1525],{"class":719},"() ",[695,1527,1528],{"class":701},"\u002F\u002F before exit\n",[1530,1531,1534,1535,1537,1538,1540,1541,1543,1544,877],"callout",{"color":1532,"icon":1533},"warning","i-lucide-alert-triangle","Always flush the pipeline before the process exits (",[597,1536,644],{},"). On Nitro use the ",[597,1539,648],{}," hook; on standalone scripts call it before ",[597,1542,652],{},"; on serverless runtimes use ",[597,1545,656],{},[675,1547,1549],{"id":1548},"how-it-works","How it works",[507,1551,1552,1553,1555,1556,1559,1560,1563,1564,1567,1568,1571,1572,1574],{},"Events are buffered as they arrive on ",[597,1554,893],{},". A batch flushes when either ",[597,1557,1558],{},"batch.size"," is reached or ",[597,1561,1562],{},"batch.intervalMs"," expires (whichever comes first). On failure, the same batch is retried with the configured backoff; once ",[597,1565,1566],{},"retry.maxAttempts"," is exhausted, ",[597,1569,1570],{},"onDropped"," is called with the lost events. The buffer is bounded by ",[597,1573,623],{}," — once full, the oldest events are dropped to keep memory flat.",[675,1576,475],{"id":1577},"configuration",[685,1579,1582],{"className":687,"code":1580,"filename":1581,"language":690,"meta":691,"style":691},"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","pipeline-config.ts",[597,1583,1584,1604,1622,1640,1644,1664,1673,1689,1704,1709,1718,1730,1746,1758,1770,1774,1786,1811,1859,1864,1871,1876],{"__ignoreMap":691},[695,1585,1586,1588,1590,1592,1594,1596,1598,1600,1602],{"class":697,"line":698},[695,1587,709],{"class":708},[695,1589,712],{"class":708},[695,1591,716],{"class":715},[695,1593,720],{"class":719},[695,1595,723],{"class":715},[695,1597,726],{"class":708},[695,1599,729],{"class":715},[695,1601,733],{"class":732},[695,1603,736],{"class":715},[695,1605,1606,1608,1610,1612,1614,1616,1618,1620],{"class":697,"line":705},[695,1607,709],{"class":708},[695,1609,716],{"class":715},[695,1611,746],{"class":719},[695,1613,723],{"class":715},[695,1615,726],{"class":708},[695,1617,729],{"class":715},[695,1619,603],{"class":732},[695,1621,736],{"class":715},[695,1623,1624,1626,1628,1630,1632,1634,1636,1638],{"class":697,"line":739},[695,1625,709],{"class":708},[695,1627,716],{"class":715},[695,1629,766],{"class":719},[695,1631,723],{"class":715},[695,1633,726],{"class":708},[695,1635,729],{"class":715},[695,1637,775],{"class":732},[695,1639,736],{"class":715},[695,1641,1642],{"class":697,"line":759},[695,1643,784],{"emptyLinePlaceholder":783},[695,1645,1646,1648,1650,1652,1654,1656,1658,1660,1662],{"class":697,"line":780},[695,1647,1043],{"class":811},[695,1649,1046],{"class":719},[695,1651,1049],{"class":715},[695,1653,746],{"class":796},[695,1655,832],{"class":715},[695,1657,836],{"class":835},[695,1659,839],{"class":715},[695,1661,800],{"class":719},[695,1663,1118],{"class":715},[695,1665,1666,1669,1671],{"class":697,"line":787},[695,1667,1668],{"class":842},"  batch",[695,1670,1126],{"class":715},[695,1672,815],{"class":715},[695,1674,1675,1678,1680,1684,1686],{"class":697,"line":818},[695,1676,1677],{"class":842},"    size",[695,1679,1126],{"class":715},[695,1681,1683],{"class":1682},"sbssI"," 50",[695,1685,898],{"class":715},[695,1687,1688],{"class":701},"          \u002F\u002F Flush every 50 events\n",[695,1690,1691,1694,1696,1699,1701],{"class":697,"line":846},[695,1692,1693],{"class":842},"    intervalMs",[695,1695,1126],{"class":715},[695,1697,1698],{"class":1682}," 5000",[695,1700,898],{"class":715},[695,1702,1703],{"class":701},"  \u002F\u002F Or every 5 seconds, whichever comes first\n",[695,1705,1706],{"class":697,"line":866},[695,1707,1708],{"class":715},"  },\n",[695,1710,1711,1714,1716],{"class":697,"line":871},[695,1712,1713],{"class":842},"  retry",[695,1715,1126],{"class":715},[695,1717,815],{"class":715},[695,1719,1720,1723,1725,1728],{"class":697,"line":906},[695,1721,1722],{"class":842},"    maxAttempts",[695,1724,1126],{"class":715},[695,1726,1727],{"class":1682}," 3",[695,1729,1136],{"class":715},[695,1731,1732,1735,1737,1739,1742,1744],{"class":697,"line":943},[695,1733,1734],{"class":842},"    backoff",[695,1736,1126],{"class":715},[695,1738,729],{"class":715},[695,1740,1741],{"class":732},"exponential",[695,1743,890],{"class":715},[695,1745,1136],{"class":715},[695,1747,1748,1751,1753,1756],{"class":697,"line":1146},[695,1749,1750],{"class":842},"    initialDelayMs",[695,1752,1126],{"class":715},[695,1754,1755],{"class":1682}," 1000",[695,1757,1136],{"class":715},[695,1759,1760,1763,1765,1768],{"class":697,"line":1153},[695,1761,1762],{"class":842},"    maxDelayMs",[695,1764,1126],{"class":715},[695,1766,1767],{"class":1682}," 30000",[695,1769,1136],{"class":715},[695,1771,1772],{"class":697,"line":1158},[695,1773,1708],{"class":715},[695,1775,1777,1780,1782,1784],{"class":697,"line":1776},16,[695,1778,1779],{"class":842},"  maxBufferSize",[695,1781,1126],{"class":715},[695,1783,1755],{"class":1682},[695,1785,1136],{"class":715},[695,1787,1789,1792,1794,1797,1800,1802,1805,1807,1809],{"class":697,"line":1788},17,[695,1790,1791],{"class":796},"  onDropped",[695,1793,1126],{"class":715},[695,1795,1796],{"class":715}," (",[695,1798,1799],{"class":805},"events",[695,1801,898],{"class":715},[695,1803,1804],{"class":805}," error",[695,1806,657],{"class":715},[695,1808,812],{"class":811},[695,1810,815],{"class":715},[695,1812,1814,1817,1819,1822,1824,1827,1830,1833,1835,1837,1840,1842,1845,1847,1849,1851,1854,1857],{"class":697,"line":1813},18,[695,1815,1816],{"class":719},"    console",[695,1818,877],{"class":715},[695,1820,1821],{"class":796},"error",[695,1823,800],{"class":842},[695,1825,1826],{"class":715},"`",[695,1828,1829],{"class":732},"[evlog] Dropped ",[695,1831,1832],{"class":715},"${",[695,1834,1799],{"class":719},[695,1836,877],{"class":715},[695,1838,1839],{"class":719},"length",[695,1841,946],{"class":715},[695,1843,1844],{"class":732}," events:",[695,1846,1826],{"class":715},[695,1848,898],{"class":715},[695,1850,1804],{"class":719},[695,1852,1853],{"class":715},"?.",[695,1855,1856],{"class":719},"message",[695,1858,903],{"class":842},[695,1860,1862],{"class":697,"line":1861},19,[695,1863,1708],{"class":715},[695,1865,1867,1869],{"class":697,"line":1866},20,[695,1868,946],{"class":715},[695,1870,903],{"class":719},[695,1872,1874],{"class":697,"line":1873},21,[695,1875,784],{"emptyLinePlaceholder":783},[695,1877,1879,1881,1883,1885,1887,1889,1891,1893],{"class":697,"line":1878},22,[695,1880,790],{"class":708},[695,1882,1087],{"class":811},[695,1884,1066],{"class":719},[695,1886,1049],{"class":715},[695,1888,824],{"class":796},[695,1890,800],{"class":719},[695,1892,860],{"class":796},[695,1894,863],{"class":719},[1896,1897,1899],"h3",{"id":1898},"options-reference","Options reference",[520,1901,1902,1915],{},[523,1903,1904],{},[526,1905,1906,1909,1912],{},[529,1907,1908],{},"Option",[529,1910,1911],{},"Default",[529,1913,1914],{},"Description",[536,1916,1917,1931,1945,1959,1982,1997,2012,2025],{},[526,1918,1919,1923,1928],{},[541,1920,1921],{},[597,1922,1558],{},[541,1924,1925],{},[597,1926,1927],{},"50",[541,1929,1930],{},"Maximum events per batch",[526,1932,1933,1937,1942],{},[541,1934,1935],{},[597,1936,1562],{},[541,1938,1939],{},[597,1940,1941],{},"5000",[541,1943,1944],{},"Max time (ms) before flushing a partial batch",[526,1946,1947,1951,1956],{},[541,1948,1949],{},[597,1950,1566],{},[541,1952,1953],{},[597,1954,1955],{},"3",[541,1957,1958],{},"Total attempts including the initial one",[526,1960,1961,1966,1971],{},[541,1962,1963],{},[597,1964,1965],{},"retry.backoff",[541,1967,1968],{},[597,1969,1970],{},"'exponential'",[541,1972,1973,1975,1976,1975,1979],{},[597,1974,1970],{}," | ",[597,1977,1978],{},"'linear'",[597,1980,1981],{},"'fixed'",[526,1983,1984,1989,1994],{},[541,1985,1986],{},[597,1987,1988],{},"retry.initialDelayMs",[541,1990,1991],{},[597,1992,1993],{},"1000",[541,1995,1996],{},"Base delay for the first retry",[526,1998,1999,2004,2009],{},[541,2000,2001],{},[597,2002,2003],{},"retry.maxDelayMs",[541,2005,2006],{},[597,2007,2008],{},"30000",[541,2010,2011],{},"Upper bound for any retry delay",[526,2013,2014,2018,2022],{},[541,2015,2016],{},[597,2017,623],{},[541,2019,2020],{},[597,2021,1993],{},[541,2023,2024],{},"Max buffered events before dropping oldest",[526,2026,2027,2031,2034],{},[541,2028,2029],{},[597,2030,1570],{},[541,2032,2033],{},"-",[541,2035,2036],{},"Callback when events are dropped (overflow or retry exhaustion)",[1896,2038,2040],{"id":2039},"backoff-strategies","Backoff strategies",[520,2042,2043,2056],{},[523,2044,2045],{},[526,2046,2047,2050,2053],{},[529,2048,2049],{},"Strategy",[529,2051,2052],{},"Delay pattern",[529,2054,2055],{},"Use case",[536,2057,2058,2070,2083],{},[526,2059,2060,2064,2067],{},[541,2061,2062],{},[597,2063,1741],{},[541,2065,2066],{},"1s, 2s, 4s, 8s…",[541,2068,2069],{},"Default. Best for transient failures that may need time to recover",[526,2071,2072,2077,2080],{},[541,2073,2074],{},[597,2075,2076],{},"linear",[541,2078,2079],{},"1s, 2s, 3s, 4s…",[541,2081,2082],{},"Predictable delay growth",[526,2084,2085,2090,2093],{},[541,2086,2087],{},[597,2088,2089],{},"fixed",[541,2091,2092],{},"1s, 1s, 1s, 1s…",[541,2094,2095],{},"Same delay every time. Useful for rate-limited APIs",[1896,2097,2099],{"id":2098},"returned-drain-function","Returned drain function",[507,2101,2102,2103,2106],{},"The function returned by ",[597,2104,2105],{},"pipeline(drain)"," is hook-compatible and exposes:",[520,2108,2109,2121],{},[523,2110,2111],{},[526,2112,2113,2116,2119],{},[529,2114,2115],{},"Property",[529,2117,2118],{},"Type",[529,2120,1914],{},[536,2122,2123,2138,2152],{},[526,2124,2125,2130,2135],{},[541,2126,2127],{},[597,2128,2129],{},"drain(ctx)",[541,2131,2132],{},[597,2133,2134],{},"(ctx: T) => void",[541,2136,2137],{},"Push a single event into the buffer",[526,2139,2140,2144,2149],{},[541,2141,2142],{},[597,2143,644],{},[541,2145,2146],{},[597,2147,2148],{},"() => Promise\u003Cvoid>",[541,2150,2151],{},"Force-flush all buffered events",[526,2153,2154,2159,2164],{},[541,2155,2156],{},[597,2157,2158],{},"drain.pending",[541,2160,2161],{},[597,2162,2163],{},"number",[541,2165,2166],{},"Number of events currently buffered",[675,2168,560],{"id":2169},"fanout",[2171,2172],"drain-fan-out",{},[507,2174,2175,2176,2179],{},"In production, the same wide event often needs to reach more than one destination: a long-term store (Axiom), a metrics tool (Datadog), an error tracker (Sentry), and a local fs drain for incident replay. The pipeline batches once, then your drain fans out the batch to every destination in parallel via ",[597,2177,2178],{},"Promise.allSettled"," so a single slow \u002F failing destination cannot block the others.",[582,2181,2183,2186,2245],{":actions":584,"description":2182,"icon":464},"Fan out evlog events to multiple destinations",[507,2184,2185],{},"Send each wide event to several destinations in parallel through a single drain pipeline.",[590,2187,2188,2204,2214,2228,2239],{},[593,2189,2190,2191,600,2193,2195,2196,2199,2200,2203],{},"Wrap a single ",[597,2192,599],{},[597,2194,603],{}," around a fan-out function that calls every destination drain inside ",[597,2197,2198],{},"Promise.allSettled([drainA(batch), drainB(batch), …])"," — ",[597,2201,2202],{},"allSettled"," so one failing drain doesn't reject the whole batch",[593,2205,2206,2207,2210,2211,657],{},"Pick destinations by purpose: long-term store (Axiom \u002F Better Stack \u002F Datadog), error tracker (Sentry — typically ",[597,2208,2209],{},"{ minLevel: 'error' }"," so it doesn't get all events), local replay (",[597,2212,2213],{},"createFsDrain",[593,2215,2216,2217,2219,2220,2219,2222,2224,2225,2227],{},"Tune ",[597,2218,1558],{},", ",[597,2221,1562],{},[597,2223,1566],{},", and ",[597,2226,623],{}," once at the pipeline level — applies to all destinations",[593,2229,2230,2231,2234,2235,2238],{},"For destinations that need different filtering, prefer per-drain ",[597,2232,2233],{},"minLevel"," \u002F ",[597,2236,2237],{},"filter"," options over wrapping",[593,2240,2241,2242,2244],{},"Don't forget ",[597,2243,644],{}," on shutdown — events buffered for fanout are lost on abrupt exit",[507,2246,663,2247],{},[511,2248,666],{"href":666,"rel":2249},[668],[1896,2251,2253],{"id":2252},"the-recipe","The recipe",[685,2255,2259],{"className":2256,"code":2257,"language":2258,"meta":691,"style":691},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createDrainPipeline } from 'evlog\u002Fpipeline'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\nimport { createDatadogDrain } from 'evlog\u002Fdatadog'\nimport { createSentryDrain } from 'evlog\u002Fsentry'\nimport { createFsDrain } from 'evlog\u002Ffs'\nimport type { DrainContext } from 'evlog'\n\nconst pipeline = createDrainPipeline\u003CDrainContext>({\n  batch: { size: 50, intervalMs: 5000 },\n  retry: { maxAttempts: 3 },\n  maxBufferSize: 1000,\n})\n\nconst axiom = createAxiomDrain()\nconst datadog = createDatadogDrain()\nconst sentry = createSentryDrain({ minLevel: 'error' })\nconst fs = createFsDrain({ dir: '.evlog\u002Flogs', maxFiles: 14 })\n\nexport const drain = pipeline(async (batch) => {\n  await Promise.allSettled([\n    axiom(batch),\n    datadog(batch),\n    sentry(batch),\n    fs(batch),\n  ])\n})\n","ts",[597,2260,2261,2279,2297,2317,2337,2357,2377,2381,2401,2428,2445,2455,2461,2465,2478,2491,2521,2562,2566,2593,2608,2621,2634,2648,2662,2668],{"__ignoreMap":691},[695,2262,2263,2265,2267,2269,2271,2273,2275,2277],{"class":697,"line":698},[695,2264,709],{"class":708},[695,2266,716],{"class":715},[695,2268,746],{"class":719},[695,2270,723],{"class":715},[695,2272,726],{"class":708},[695,2274,729],{"class":715},[695,2276,603],{"class":732},[695,2278,736],{"class":715},[695,2280,2281,2283,2285,2287,2289,2291,2293,2295],{"class":697,"line":705},[695,2282,709],{"class":708},[695,2284,716],{"class":715},[695,2286,766],{"class":719},[695,2288,723],{"class":715},[695,2290,726],{"class":708},[695,2292,729],{"class":715},[695,2294,775],{"class":732},[695,2296,736],{"class":715},[695,2298,2299,2301,2303,2306,2308,2310,2312,2315],{"class":697,"line":739},[695,2300,709],{"class":708},[695,2302,716],{"class":715},[695,2304,2305],{"class":719}," createDatadogDrain",[695,2307,723],{"class":715},[695,2309,726],{"class":708},[695,2311,729],{"class":715},[695,2313,2314],{"class":732},"evlog\u002Fdatadog",[695,2316,736],{"class":715},[695,2318,2319,2321,2323,2326,2328,2330,2332,2335],{"class":697,"line":759},[695,2320,709],{"class":708},[695,2322,716],{"class":715},[695,2324,2325],{"class":719}," createSentryDrain",[695,2327,723],{"class":715},[695,2329,726],{"class":708},[695,2331,729],{"class":715},[695,2333,2334],{"class":732},"evlog\u002Fsentry",[695,2336,736],{"class":715},[695,2338,2339,2341,2343,2346,2348,2350,2352,2355],{"class":697,"line":780},[695,2340,709],{"class":708},[695,2342,716],{"class":715},[695,2344,2345],{"class":719}," createFsDrain",[695,2347,723],{"class":715},[695,2349,726],{"class":708},[695,2351,729],{"class":715},[695,2353,2354],{"class":732},"evlog\u002Ffs",[695,2356,736],{"class":715},[695,2358,2359,2361,2363,2365,2367,2369,2371,2373,2375],{"class":697,"line":787},[695,2360,709],{"class":708},[695,2362,712],{"class":708},[695,2364,716],{"class":715},[695,2366,720],{"class":719},[695,2368,723],{"class":715},[695,2370,726],{"class":708},[695,2372,729],{"class":715},[695,2374,733],{"class":732},[695,2376,736],{"class":715},[695,2378,2379],{"class":697,"line":818},[695,2380,784],{"emptyLinePlaceholder":783},[695,2382,2383,2385,2387,2389,2391,2393,2395,2397,2399],{"class":697,"line":846},[695,2384,1043],{"class":811},[695,2386,1046],{"class":719},[695,2388,1049],{"class":715},[695,2390,746],{"class":796},[695,2392,832],{"class":715},[695,2394,836],{"class":835},[695,2396,839],{"class":715},[695,2398,800],{"class":719},[695,2400,1118],{"class":715},[695,2402,2403,2405,2407,2409,2412,2414,2416,2418,2421,2423,2425],{"class":697,"line":866},[695,2404,1668],{"class":842},[695,2406,1126],{"class":715},[695,2408,716],{"class":715},[695,2410,2411],{"class":842}," size",[695,2413,1126],{"class":715},[695,2415,1683],{"class":1682},[695,2417,898],{"class":715},[695,2419,2420],{"class":842}," intervalMs",[695,2422,1126],{"class":715},[695,2424,1698],{"class":1682},[695,2426,2427],{"class":715}," },\n",[695,2429,2430,2432,2434,2436,2439,2441,2443],{"class":697,"line":871},[695,2431,1713],{"class":842},[695,2433,1126],{"class":715},[695,2435,716],{"class":715},[695,2437,2438],{"class":842}," maxAttempts",[695,2440,1126],{"class":715},[695,2442,1727],{"class":1682},[695,2444,2427],{"class":715},[695,2446,2447,2449,2451,2453],{"class":697,"line":906},[695,2448,1779],{"class":842},[695,2450,1126],{"class":715},[695,2452,1755],{"class":1682},[695,2454,1136],{"class":715},[695,2456,2457,2459],{"class":697,"line":943},[695,2458,946],{"class":715},[695,2460,903],{"class":719},[695,2462,2463],{"class":697,"line":1146},[695,2464,784],{"emptyLinePlaceholder":783},[695,2466,2467,2469,2472,2474,2476],{"class":697,"line":1153},[695,2468,1043],{"class":811},[695,2470,2471],{"class":719}," axiom ",[695,2473,1049],{"class":715},[695,2475,766],{"class":796},[695,2477,843],{"class":719},[695,2479,2480,2482,2485,2487,2489],{"class":697,"line":1158},[695,2481,1043],{"class":811},[695,2483,2484],{"class":719}," datadog ",[695,2486,1049],{"class":715},[695,2488,2305],{"class":796},[695,2490,843],{"class":719},[695,2492,2493,2495,2498,2500,2502,2504,2506,2509,2511,2513,2515,2517,2519],{"class":697,"line":1776},[695,2494,1043],{"class":811},[695,2496,2497],{"class":719}," sentry ",[695,2499,1049],{"class":715},[695,2501,2325],{"class":796},[695,2503,800],{"class":719},[695,2505,1302],{"class":715},[695,2507,2508],{"class":842}," minLevel",[695,2510,1126],{"class":715},[695,2512,729],{"class":715},[695,2514,1821],{"class":732},[695,2516,890],{"class":715},[695,2518,723],{"class":715},[695,2520,903],{"class":719},[695,2522,2523,2525,2528,2530,2532,2534,2536,2539,2541,2543,2546,2548,2550,2553,2555,2558,2560],{"class":697,"line":1788},[695,2524,1043],{"class":811},[695,2526,2527],{"class":719}," fs ",[695,2529,1049],{"class":715},[695,2531,2345],{"class":796},[695,2533,800],{"class":719},[695,2535,1302],{"class":715},[695,2537,2538],{"class":842}," dir",[695,2540,1126],{"class":715},[695,2542,729],{"class":715},[695,2544,2545],{"class":732},".evlog\u002Flogs",[695,2547,890],{"class":715},[695,2549,898],{"class":715},[695,2551,2552],{"class":842}," maxFiles",[695,2554,1126],{"class":715},[695,2556,2557],{"class":1682}," 14",[695,2559,723],{"class":715},[695,2561,903],{"class":719},[695,2563,2564],{"class":697,"line":1813},[695,2565,784],{"emptyLinePlaceholder":783},[695,2567,2568,2570,2572,2574,2576,2578,2580,2583,2585,2587,2589,2591],{"class":697,"line":1861},[695,2569,790],{"class":708},[695,2571,1087],{"class":811},[695,2573,1066],{"class":719},[695,2575,1049],{"class":715},[695,2577,824],{"class":796},[695,2579,800],{"class":719},[695,2581,2582],{"class":811},"async",[695,2584,1796],{"class":715},[695,2586,615],{"class":805},[695,2588,657],{"class":715},[695,2590,812],{"class":811},[695,2592,815],{"class":715},[695,2594,2595,2598,2601,2603,2605],{"class":697,"line":1866},[695,2596,2597],{"class":708},"  await",[695,2599,2600],{"class":835}," Promise",[695,2602,877],{"class":715},[695,2604,2202],{"class":796},[695,2606,2607],{"class":842},"([\n",[695,2609,2610,2613,2615,2617,2619],{"class":697,"line":1873},[695,2611,2612],{"class":796},"    axiom",[695,2614,800],{"class":842},[695,2616,615],{"class":719},[695,2618,657],{"class":842},[695,2620,1136],{"class":715},[695,2622,2623,2626,2628,2630,2632],{"class":697,"line":1878},[695,2624,2625],{"class":796},"    datadog",[695,2627,800],{"class":842},[695,2629,615],{"class":719},[695,2631,657],{"class":842},[695,2633,1136],{"class":715},[695,2635,2637,2640,2642,2644,2646],{"class":697,"line":2636},23,[695,2638,2639],{"class":796},"    sentry",[695,2641,800],{"class":842},[695,2643,615],{"class":719},[695,2645,657],{"class":842},[695,2647,1136],{"class":715},[695,2649,2651,2654,2656,2658,2660],{"class":697,"line":2650},24,[695,2652,2653],{"class":796},"    fs",[695,2655,800],{"class":842},[695,2657,615],{"class":719},[695,2659,657],{"class":842},[695,2661,1136],{"class":715},[695,2663,2665],{"class":697,"line":2664},25,[695,2666,2667],{"class":842},"  ])\n",[695,2669,2671,2673],{"class":697,"line":2670},26,[695,2672,946],{"class":715},[695,2674,903],{"class":719},[1896,2676,2678],{"id":2677},"what-you-get","What you get",[590,2680,2681,2690,2696],{},[593,2682,2683,2687,2688],{},[2684,2685,2686],"strong",{},"Parallel dispatch"," — every destination receives the batch concurrently via ",[597,2689,2178],{},[593,2691,2692,2695],{},[2684,2693,2694],{},"Tolerant fanout"," — if Datadog's API throws, Axiom \u002F Sentry \u002F fs still complete; the pipeline only retries the whole batch when the wrapping function rejects",[593,2697,2698,2701],{},[2684,2699,2700],{},"Shared backpressure"," — the buffer is sized once for the whole pipeline; if the wrapping drain falls behind, the oldest events are dropped consistently for every destination",[1896,2703,2705],{"id":2704},"per-drain-filtering","Per-drain filtering",[507,2707,2708],{},"Wrap a destination drain so it only sees events you care about:",[685,2710,2712],{"className":2256,"code":2711,"language":2258,"meta":691,"style":691},"import type { DrainContext } from 'evlog'\n\nconst sentry = createSentryDrain({ dsn: process.env.SENTRY_DSN! })\n\nasync function sentryErrorsOnly(batch: DrainContext[]): Promise\u003Cvoid> {\n  const errors = batch.filter(c => c.event?.level === 'error')\n  if (errors.length > 0) await sentry(errors)\n}\n\nexport const drain = pipeline(async (batch) => {\n  await Promise.allSettled([\n    axiom(batch),\n    sentryErrorsOnly(batch),\n  ])\n})\n",[597,2713,2714,2734,2738,2777,2781,2816,2863,2897,2902,2906,2932,2944,2956,2969,2973],{"__ignoreMap":691},[695,2715,2716,2718,2720,2722,2724,2726,2728,2730,2732],{"class":697,"line":698},[695,2717,709],{"class":708},[695,2719,712],{"class":708},[695,2721,716],{"class":715},[695,2723,720],{"class":719},[695,2725,723],{"class":715},[695,2727,726],{"class":708},[695,2729,729],{"class":715},[695,2731,733],{"class":732},[695,2733,736],{"class":715},[695,2735,2736],{"class":697,"line":705},[695,2737,784],{"emptyLinePlaceholder":783},[695,2739,2740,2742,2744,2746,2748,2750,2752,2755,2757,2760,2762,2765,2767,2770,2773,2775],{"class":697,"line":739},[695,2741,1043],{"class":811},[695,2743,2497],{"class":719},[695,2745,1049],{"class":715},[695,2747,2325],{"class":796},[695,2749,800],{"class":719},[695,2751,1302],{"class":715},[695,2753,2754],{"class":842}," dsn",[695,2756,1126],{"class":715},[695,2758,2759],{"class":719}," process",[695,2761,877],{"class":715},[695,2763,2764],{"class":719},"env",[695,2766,877],{"class":715},[695,2768,2769],{"class":719},"SENTRY_DSN",[695,2771,2772],{"class":715},"!",[695,2774,723],{"class":715},[695,2776,903],{"class":719},[695,2778,2779],{"class":697,"line":759},[695,2780,784],{"emptyLinePlaceholder":783},[695,2782,2783,2785,2788,2791,2793,2795,2797,2799,2802,2805,2807,2809,2812,2814],{"class":697,"line":780},[695,2784,2582],{"class":811},[695,2786,2787],{"class":811}," function",[695,2789,2790],{"class":796}," sentryErrorsOnly",[695,2792,800],{"class":715},[695,2794,615],{"class":805},[695,2796,1126],{"class":715},[695,2798,720],{"class":835},[695,2800,2801],{"class":719},"[]",[695,2803,2804],{"class":715},"):",[695,2806,2600],{"class":835},[695,2808,832],{"class":715},[695,2810,2811],{"class":835},"void",[695,2813,839],{"class":715},[695,2815,815],{"class":715},[695,2817,2818,2820,2823,2825,2828,2830,2832,2834,2837,2839,2842,2844,2847,2849,2852,2855,2857,2859,2861],{"class":697,"line":787},[695,2819,821],{"class":811},[695,2821,2822],{"class":719}," errors",[695,2824,827],{"class":715},[695,2826,2827],{"class":719}," batch",[695,2829,877],{"class":715},[695,2831,2237],{"class":796},[695,2833,800],{"class":842},[695,2835,2836],{"class":805},"c",[695,2838,812],{"class":811},[695,2840,2841],{"class":719}," c",[695,2843,877],{"class":715},[695,2845,2846],{"class":719},"event",[695,2848,1853],{"class":715},[695,2850,2851],{"class":719},"level",[695,2853,2854],{"class":715}," ===",[695,2856,729],{"class":715},[695,2858,1821],{"class":732},[695,2860,890],{"class":715},[695,2862,903],{"class":842},[695,2864,2865,2868,2870,2873,2875,2877,2880,2883,2886,2888,2891,2893,2895],{"class":697,"line":818},[695,2866,2867],{"class":708},"  if",[695,2869,1796],{"class":842},[695,2871,2872],{"class":719},"errors",[695,2874,877],{"class":715},[695,2876,1839],{"class":719},[695,2878,2879],{"class":715}," >",[695,2881,2882],{"class":1682}," 0",[695,2884,2885],{"class":842},") ",[695,2887,1516],{"class":708},[695,2889,2890],{"class":796}," sentry",[695,2892,800],{"class":842},[695,2894,2872],{"class":719},[695,2896,903],{"class":842},[695,2898,2899],{"class":697,"line":846},[695,2900,2901],{"class":715},"}\n",[695,2903,2904],{"class":697,"line":866},[695,2905,784],{"emptyLinePlaceholder":783},[695,2907,2908,2910,2912,2914,2916,2918,2920,2922,2924,2926,2928,2930],{"class":697,"line":871},[695,2909,790],{"class":708},[695,2911,1087],{"class":811},[695,2913,1066],{"class":719},[695,2915,1049],{"class":715},[695,2917,824],{"class":796},[695,2919,800],{"class":719},[695,2921,2582],{"class":811},[695,2923,1796],{"class":715},[695,2925,615],{"class":805},[695,2927,657],{"class":715},[695,2929,812],{"class":811},[695,2931,815],{"class":715},[695,2933,2934,2936,2938,2940,2942],{"class":697,"line":906},[695,2935,2597],{"class":708},[695,2937,2600],{"class":835},[695,2939,877],{"class":715},[695,2941,2202],{"class":796},[695,2943,2607],{"class":842},[695,2945,2946,2948,2950,2952,2954],{"class":697,"line":943},[695,2947,2612],{"class":796},[695,2949,800],{"class":842},[695,2951,615],{"class":719},[695,2953,657],{"class":842},[695,2955,1136],{"class":715},[695,2957,2958,2961,2963,2965,2967],{"class":697,"line":1146},[695,2959,2960],{"class":796},"    sentryErrorsOnly",[695,2962,800],{"class":842},[695,2964,615],{"class":719},[695,2966,657],{"class":842},[695,2968,1136],{"class":715},[695,2970,2971],{"class":697,"line":1153},[695,2972,2667],{"class":842},[695,2974,2975,2977],{"class":697,"line":1158},[695,2976,946],{"class":715},[695,2978,903],{"class":719},[507,2980,2981,2982,2984],{},"Most built-in drains expose ",[597,2983,2233],{}," directly, so you only need this pattern for non-level filters (path, custom field, etc.).",[675,2986,2988],{"id":2987},"custom-drain-function","Custom drain function",[507,2990,2991],{},"You don't need an adapter. Pass any async function that accepts a batch:",[685,2993,2996],{"className":687,"code":2994,"filename":2995,"language":690,"meta":691,"style":691},"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","pipeline-custom.ts",[597,2997,2998,3018,3036,3040,3079,3083,3109,3129,3145,3172,3214,3221],{"__ignoreMap":691},[695,2999,3000,3002,3004,3006,3008,3010,3012,3014,3016],{"class":697,"line":698},[695,3001,709],{"class":708},[695,3003,712],{"class":708},[695,3005,716],{"class":715},[695,3007,720],{"class":719},[695,3009,723],{"class":715},[695,3011,726],{"class":708},[695,3013,729],{"class":715},[695,3015,733],{"class":732},[695,3017,736],{"class":715},[695,3019,3020,3022,3024,3026,3028,3030,3032,3034],{"class":697,"line":705},[695,3021,709],{"class":708},[695,3023,716],{"class":715},[695,3025,746],{"class":719},[695,3027,723],{"class":715},[695,3029,726],{"class":708},[695,3031,729],{"class":715},[695,3033,603],{"class":732},[695,3035,736],{"class":715},[695,3037,3038],{"class":697,"line":739},[695,3039,784],{"emptyLinePlaceholder":783},[695,3041,3042,3044,3046,3048,3050,3052,3054,3056,3058,3060,3062,3064,3066,3068,3070,3073,3075,3077],{"class":697,"line":759},[695,3043,1043],{"class":811},[695,3045,1046],{"class":719},[695,3047,1049],{"class":715},[695,3049,746],{"class":796},[695,3051,832],{"class":715},[695,3053,836],{"class":835},[695,3055,839],{"class":715},[695,3057,800],{"class":719},[695,3059,1302],{"class":715},[695,3061,2827],{"class":842},[695,3063,1126],{"class":715},[695,3065,716],{"class":715},[695,3067,2411],{"class":842},[695,3069,1126],{"class":715},[695,3071,3072],{"class":1682}," 100",[695,3074,723],{"class":715},[695,3076,723],{"class":715},[695,3078,903],{"class":719},[695,3080,3081],{"class":697,"line":780},[695,3082,784],{"emptyLinePlaceholder":783},[695,3084,3085,3087,3089,3091,3093,3095,3097,3099,3101,3103,3105,3107],{"class":697,"line":787},[695,3086,790],{"class":708},[695,3088,1087],{"class":811},[695,3090,1066],{"class":719},[695,3092,1049],{"class":715},[695,3094,824],{"class":796},[695,3096,800],{"class":719},[695,3098,2582],{"class":811},[695,3100,1796],{"class":715},[695,3102,615],{"class":805},[695,3104,657],{"class":715},[695,3106,812],{"class":811},[695,3108,815],{"class":715},[695,3110,3111,3113,3116,3118,3120,3123,3125,3127],{"class":697,"line":818},[695,3112,2597],{"class":708},[695,3114,3115],{"class":796}," fetch",[695,3117,800],{"class":842},[695,3119,890],{"class":715},[695,3121,3122],{"class":732},"https:\u002F\u002Fyour-service.com\u002Flogs",[695,3124,890],{"class":715},[695,3126,898],{"class":715},[695,3128,815],{"class":715},[695,3130,3131,3134,3136,3138,3141,3143],{"class":697,"line":846},[695,3132,3133],{"class":842},"    method",[695,3135,1126],{"class":715},[695,3137,729],{"class":715},[695,3139,3140],{"class":732},"POST",[695,3142,890],{"class":715},[695,3144,1136],{"class":715},[695,3146,3147,3150,3152,3154,3156,3159,3161,3163,3165,3168,3170],{"class":697,"line":866},[695,3148,3149],{"class":842},"    headers",[695,3151,1126],{"class":715},[695,3153,716],{"class":715},[695,3155,729],{"class":715},[695,3157,3158],{"class":842},"Content-Type",[695,3160,890],{"class":715},[695,3162,1126],{"class":715},[695,3164,729],{"class":715},[695,3166,3167],{"class":732},"application\u002Fjson",[695,3169,890],{"class":715},[695,3171,2427],{"class":715},[695,3173,3174,3177,3179,3182,3184,3187,3189,3191,3193,3195,3197,3200,3202,3205,3207,3209,3212],{"class":697,"line":871},[695,3175,3176],{"class":842},"    body",[695,3178,1126],{"class":715},[695,3180,3181],{"class":719}," JSON",[695,3183,877],{"class":715},[695,3185,3186],{"class":796},"stringify",[695,3188,800],{"class":842},[695,3190,615],{"class":719},[695,3192,877],{"class":715},[695,3194,89],{"class":796},[695,3196,800],{"class":842},[695,3198,3199],{"class":805},"ctx",[695,3201,812],{"class":811},[695,3203,3204],{"class":719}," ctx",[695,3206,877],{"class":715},[695,3208,2846],{"class":719},[695,3210,3211],{"class":842},"))",[695,3213,1136],{"class":715},[695,3215,3216,3219],{"class":697,"line":906},[695,3217,3218],{"class":715},"  }",[695,3220,903],{"class":842},[695,3222,3223,3225],{"class":697,"line":943},[695,3224,946],{"class":715},[695,3226,903],{"class":719},[507,3228,3229,3230,3235],{},"For anything more involved (config resolution, retries, identity headers), use ",[511,3231,3232],{"href":462},[597,3233,3234],{},"defineHttpDrain"," instead and let the toolkit handle the boilerplate.",[675,3237,570],{"id":3238},"http-drain-browser-to-server",[507,3240,3241,3242,3245,3246,3249,3250,3253],{},"The HTTP drain is a framework-agnostic transport for shipping client-side logs to your server. It composes on top of the same pipeline primitives, with browser-specific defaults (",[597,3243,3244],{},"fetch keepalive"," + ",[597,3247,3248],{},"sendBeacon"," on ",[597,3251,3252],{},"visibilitychange",").",[1530,3255,3257,3258,3261,3262,3265,3266,3269,3270,3273,3274,3276],{"color":3256,"icon":13},"neutral","The ",[597,3259,3260],{},"evlog\u002Fbrowser"," import path is ",[2684,3263,3264],{},"deprecated"," and re-exports the same API as ",[597,3267,3268],{},"evlog\u002Fhttp",". It will be removed in the next ",[2684,3271,3272],{},"major"," release. Prefer ",[597,3275,3268],{}," for new code.",[582,3278,3281,3284,3333],{":actions":584,"description":3279,"icon":3280},"Set up the HTTP transport for client logs","i-lucide-globe",[507,3282,3283],{},"Set up the HTTP transport so my browser logs are sent to my server.",[590,3285,3286,3289,3300,3310,3317,3326],{},[593,3287,3288],{},"Install evlog: pnpm add evlog",[593,3290,595,3291,600,3294,3296,3297,3299],{},[597,3292,3293],{},"createHttpLogDrain",[597,3295,3268],{}," (NOT ",[597,3298,3260],{}," — that's deprecated)",[593,3301,3302,3303,3306,3307,657],{},"Create a drain with ",[597,3304,3305],{},"{ endpoint: 'https:\u002F\u002Flogs.example.com\u002Fv1\u002Fingest' }"," and an optional pipeline (",[597,3308,3309],{},"{ batch: { size, intervalMs } }",[593,3311,3312,3313,3316],{},"Pass the drain to ",[597,3314,3315],{},"initLogger({ drain })"," on the client side",[593,3318,3319,3320,3245,3322,3249,3324],{},"The drain batches events and uses ",[597,3321,3244],{},[597,3323,3248],{},[597,3325,3252],{},[593,3327,3328,3329,3332],{},"On the server, accept POST requests with a ",[597,3330,3331],{},"DrainContext[]"," body and forward them to my drain pipeline",[507,3334,663,3335],{},[511,3336,666],{"href":666,"rel":3337},[668],[1896,3339,549],{"id":3340},"quick-start-1",[685,3342,3345],{"className":687,"code":3343,"filename":3344,"language":690,"meta":691,"style":691},"import { initLogger, log } from 'evlog'\nimport { createHttpLogDrain } from 'evlog\u002Fhttp'\n\nconst drain = createHttpLogDrain({\n  drain: { endpoint: 'https:\u002F\u002Flogs.example.com\u002Fv1\u002Fingest' },\n})\ninitLogger({ drain })\n\nlog.info({ action: 'page_view', path: location.pathname })\n","app.ts",[597,3346,3347,3369,3388,3392,3406,3428,3434,3448,3452],{"__ignoreMap":691},[695,3348,3349,3351,3353,3355,3357,3359,3361,3363,3365,3367],{"class":697,"line":698},[695,3350,709],{"class":708},[695,3352,716],{"class":715},[695,3354,1404],{"class":719},[695,3356,898],{"class":715},[695,3358,1102],{"class":719},[695,3360,723],{"class":715},[695,3362,726],{"class":708},[695,3364,729],{"class":715},[695,3366,733],{"class":732},[695,3368,736],{"class":715},[695,3370,3371,3373,3375,3378,3380,3382,3384,3386],{"class":697,"line":705},[695,3372,709],{"class":708},[695,3374,716],{"class":715},[695,3376,3377],{"class":719}," createHttpLogDrain",[695,3379,723],{"class":715},[695,3381,726],{"class":708},[695,3383,729],{"class":715},[695,3385,3268],{"class":732},[695,3387,736],{"class":715},[695,3389,3390],{"class":697,"line":739},[695,3391,784],{"emptyLinePlaceholder":783},[695,3393,3394,3396,3398,3400,3402,3404],{"class":697,"line":759},[695,3395,1043],{"class":811},[695,3397,1066],{"class":719},[695,3399,1049],{"class":715},[695,3401,3377],{"class":796},[695,3403,800],{"class":719},[695,3405,1118],{"class":715},[695,3407,3408,3410,3412,3414,3417,3419,3421,3424,3426],{"class":697,"line":780},[695,3409,1141],{"class":842},[695,3411,1126],{"class":715},[695,3413,716],{"class":715},[695,3415,3416],{"class":842}," endpoint",[695,3418,1126],{"class":715},[695,3420,729],{"class":715},[695,3422,3423],{"class":732},"https:\u002F\u002Flogs.example.com\u002Fv1\u002Fingest",[695,3425,890],{"class":715},[695,3427,2427],{"class":715},[695,3429,3430,3432],{"class":697,"line":787},[695,3431,946],{"class":715},[695,3433,903],{"class":719},[695,3435,3436,3438,3440,3442,3444,3446],{"class":697,"line":818},[695,3437,1497],{"class":796},[695,3439,800],{"class":719},[695,3441,1302],{"class":715},[695,3443,1066],{"class":719},[695,3445,946],{"class":715},[695,3447,903],{"class":719},[695,3449,3450],{"class":697,"line":846},[695,3451,784],{"emptyLinePlaceholder":783},[695,3453,3454,3457,3459,3462,3464,3466,3469,3471,3473,3476,3478,3480,3483,3485,3488,3490,3493,3495],{"class":697,"line":866},[695,3455,3456],{"class":719},"log",[695,3458,877],{"class":715},[695,3460,3461],{"class":796},"info",[695,3463,800],{"class":719},[695,3465,1302],{"class":715},[695,3467,3468],{"class":842}," action",[695,3470,1126],{"class":715},[695,3472,729],{"class":715},[695,3474,3475],{"class":732},"page_view",[695,3477,890],{"class":715},[695,3479,898],{"class":715},[695,3481,3482],{"class":842}," path",[695,3484,1126],{"class":715},[695,3486,3487],{"class":719}," location",[695,3489,877],{"class":715},[695,3491,3492],{"class":719},"pathname ",[695,3494,946],{"class":715},[695,3496,903],{"class":719},[1896,3498,3500],{"id":3499},"how-it-works-browser-specifics","How it works (browser specifics)",[3502,3503,3504,3516,3519,3530,3537],"ol",{},[593,3505,3506,2234,3509,2234,3512,3515],{},[597,3507,3508],{},"log.info()",[597,3510,3511],{},"log.warn()",[597,3513,3514],{},"log.error()"," push events into a memory buffer",[593,3517,3518],{},"Events are batched by size (default 25) or time interval (default 2 s)",[593,3520,3521,3522,3525,3526,3529],{},"Batches are sent via ",[597,3523,3524],{},"fetch"," with ",[597,3527,3528],{},"keepalive: true"," so requests survive page navigation",[593,3531,3532,3533,3536],{},"When the page becomes hidden (tab switch, navigation), buffered events are flushed via ",[597,3534,3535],{},"navigator.sendBeacon"," as a fallback",[593,3538,3539,3540,3542],{},"Your server endpoint receives a ",[597,3541,3331],{}," JSON array and processes it however you like",[1896,3544,3546],{"id":3545},"two-tier-api","Two-tier API",[3548,3549,3551],"h4",{"id":3550},"createhttplogdrainoptions",[597,3552,3553],{},"createHttpLogDrain(options)",[507,3555,3556,3557,3559,3560,3563,3564,877],{},"High-level, pre-composed: creates a pipeline with batching, retry, and auto-flush on ",[597,3558,3252],{},". Returns a ",[597,3561,3562],{},"PipelineDrainFn\u003CDrainContext>"," directly usable with ",[597,3565,3315],{},[685,3567,3569],{"className":687,"code":3568,"filename":3344,"language":690,"meta":691,"style":691},"import { initLogger, log } from 'evlog'\nimport { createHttpLogDrain } from 'evlog\u002Fhttp'\n\nconst drain = createHttpLogDrain({\n  drain: { endpoint: 'https:\u002F\u002Flogs.example.com\u002Fv1\u002Fingest' },\n  pipeline: { batch: { size: 50, intervalMs: 5000 } },\n})\n\ninitLogger({ drain })\nlog.info({ action: 'click', target: 'buy-button' })\n",[597,3570,3571,3593,3611,3615,3629,3649,3682,3688,3692,3706],{"__ignoreMap":691},[695,3572,3573,3575,3577,3579,3581,3583,3585,3587,3589,3591],{"class":697,"line":698},[695,3574,709],{"class":708},[695,3576,716],{"class":715},[695,3578,1404],{"class":719},[695,3580,898],{"class":715},[695,3582,1102],{"class":719},[695,3584,723],{"class":715},[695,3586,726],{"class":708},[695,3588,729],{"class":715},[695,3590,733],{"class":732},[695,3592,736],{"class":715},[695,3594,3595,3597,3599,3601,3603,3605,3607,3609],{"class":697,"line":705},[695,3596,709],{"class":708},[695,3598,716],{"class":715},[695,3600,3377],{"class":719},[695,3602,723],{"class":715},[695,3604,726],{"class":708},[695,3606,729],{"class":715},[695,3608,3268],{"class":732},[695,3610,736],{"class":715},[695,3612,3613],{"class":697,"line":739},[695,3614,784],{"emptyLinePlaceholder":783},[695,3616,3617,3619,3621,3623,3625,3627],{"class":697,"line":759},[695,3618,1043],{"class":811},[695,3620,1066],{"class":719},[695,3622,1049],{"class":715},[695,3624,3377],{"class":796},[695,3626,800],{"class":719},[695,3628,1118],{"class":715},[695,3630,3631,3633,3635,3637,3639,3641,3643,3645,3647],{"class":697,"line":780},[695,3632,1141],{"class":842},[695,3634,1126],{"class":715},[695,3636,716],{"class":715},[695,3638,3416],{"class":842},[695,3640,1126],{"class":715},[695,3642,729],{"class":715},[695,3644,3423],{"class":732},[695,3646,890],{"class":715},[695,3648,2427],{"class":715},[695,3650,3651,3654,3656,3658,3660,3662,3664,3666,3668,3670,3672,3674,3676,3678,3680],{"class":697,"line":787},[695,3652,3653],{"class":842},"  pipeline",[695,3655,1126],{"class":715},[695,3657,716],{"class":715},[695,3659,2827],{"class":842},[695,3661,1126],{"class":715},[695,3663,716],{"class":715},[695,3665,2411],{"class":842},[695,3667,1126],{"class":715},[695,3669,1683],{"class":1682},[695,3671,898],{"class":715},[695,3673,2420],{"class":842},[695,3675,1126],{"class":715},[695,3677,1698],{"class":1682},[695,3679,723],{"class":715},[695,3681,2427],{"class":715},[695,3683,3684,3686],{"class":697,"line":818},[695,3685,946],{"class":715},[695,3687,903],{"class":719},[695,3689,3690],{"class":697,"line":846},[695,3691,784],{"emptyLinePlaceholder":783},[695,3693,3694,3696,3698,3700,3702,3704],{"class":697,"line":866},[695,3695,1497],{"class":796},[695,3697,800],{"class":719},[695,3699,1302],{"class":715},[695,3701,1066],{"class":719},[695,3703,946],{"class":715},[695,3705,903],{"class":719},[695,3707,3708,3710,3712,3714,3716,3718,3720,3722,3724,3727,3729,3731,3734,3736,3738,3741,3743,3745],{"class":697,"line":871},[695,3709,3456],{"class":719},[695,3711,877],{"class":715},[695,3713,3461],{"class":796},[695,3715,800],{"class":719},[695,3717,1302],{"class":715},[695,3719,3468],{"class":842},[695,3721,1126],{"class":715},[695,3723,729],{"class":715},[695,3725,3726],{"class":732},"click",[695,3728,890],{"class":715},[695,3730,898],{"class":715},[695,3732,3733],{"class":842}," target",[695,3735,1126],{"class":715},[695,3737,729],{"class":715},[695,3739,3740],{"class":732},"buy-button",[695,3742,890],{"class":715},[695,3744,723],{"class":715},[695,3746,903],{"class":719},[3548,3748,3750],{"id":3749},"createhttpdrainconfig",[597,3751,3752],{},"createHttpDrain(config)",[507,3754,3755],{},"Low-level transport function. Use this when you want full control over the pipeline configuration:",[685,3757,3759],{"className":687,"code":3758,"filename":3344,"language":690,"meta":691,"style":691},"import { createHttpDrain } from 'evlog\u002Fhttp'\nimport { createDrainPipeline } from 'evlog\u002Fpipeline'\nimport type { DrainContext } from 'evlog'\n\nconst transport = createHttpDrain({\n  endpoint: 'https:\u002F\u002Flogs.example.com\u002Fv1\u002Fingest',\n})\nconst pipeline = createDrainPipeline\u003CDrainContext>({\n  batch: { size: 100, intervalMs: 10000 },\n  retry: { maxAttempts: 5 },\n})\n\nconst drain = pipeline(transport)\n",[597,3760,3761,3780,3798,3818,3822,3837,3852,3858,3878,3903,3920,3926,3930],{"__ignoreMap":691},[695,3762,3763,3765,3767,3770,3772,3774,3776,3778],{"class":697,"line":698},[695,3764,709],{"class":708},[695,3766,716],{"class":715},[695,3768,3769],{"class":719}," createHttpDrain",[695,3771,723],{"class":715},[695,3773,726],{"class":708},[695,3775,729],{"class":715},[695,3777,3268],{"class":732},[695,3779,736],{"class":715},[695,3781,3782,3784,3786,3788,3790,3792,3794,3796],{"class":697,"line":705},[695,3783,709],{"class":708},[695,3785,716],{"class":715},[695,3787,746],{"class":719},[695,3789,723],{"class":715},[695,3791,726],{"class":708},[695,3793,729],{"class":715},[695,3795,603],{"class":732},[695,3797,736],{"class":715},[695,3799,3800,3802,3804,3806,3808,3810,3812,3814,3816],{"class":697,"line":739},[695,3801,709],{"class":708},[695,3803,712],{"class":708},[695,3805,716],{"class":715},[695,3807,720],{"class":719},[695,3809,723],{"class":715},[695,3811,726],{"class":708},[695,3813,729],{"class":715},[695,3815,733],{"class":732},[695,3817,736],{"class":715},[695,3819,3820],{"class":697,"line":759},[695,3821,784],{"emptyLinePlaceholder":783},[695,3823,3824,3826,3829,3831,3833,3835],{"class":697,"line":780},[695,3825,1043],{"class":811},[695,3827,3828],{"class":719}," transport ",[695,3830,1049],{"class":715},[695,3832,3769],{"class":796},[695,3834,800],{"class":719},[695,3836,1118],{"class":715},[695,3838,3839,3842,3844,3846,3848,3850],{"class":697,"line":787},[695,3840,3841],{"class":842},"  endpoint",[695,3843,1126],{"class":715},[695,3845,729],{"class":715},[695,3847,3423],{"class":732},[695,3849,890],{"class":715},[695,3851,1136],{"class":715},[695,3853,3854,3856],{"class":697,"line":818},[695,3855,946],{"class":715},[695,3857,903],{"class":719},[695,3859,3860,3862,3864,3866,3868,3870,3872,3874,3876],{"class":697,"line":846},[695,3861,1043],{"class":811},[695,3863,1046],{"class":719},[695,3865,1049],{"class":715},[695,3867,746],{"class":796},[695,3869,832],{"class":715},[695,3871,836],{"class":835},[695,3873,839],{"class":715},[695,3875,800],{"class":719},[695,3877,1118],{"class":715},[695,3879,3880,3882,3884,3886,3888,3890,3892,3894,3896,3898,3901],{"class":697,"line":866},[695,3881,1668],{"class":842},[695,3883,1126],{"class":715},[695,3885,716],{"class":715},[695,3887,2411],{"class":842},[695,3889,1126],{"class":715},[695,3891,3072],{"class":1682},[695,3893,898],{"class":715},[695,3895,2420],{"class":842},[695,3897,1126],{"class":715},[695,3899,3900],{"class":1682}," 10000",[695,3902,2427],{"class":715},[695,3904,3905,3907,3909,3911,3913,3915,3918],{"class":697,"line":871},[695,3906,1713],{"class":842},[695,3908,1126],{"class":715},[695,3910,716],{"class":715},[695,3912,2438],{"class":842},[695,3914,1126],{"class":715},[695,3916,3917],{"class":1682}," 5",[695,3919,2427],{"class":715},[695,3921,3922,3924],{"class":697,"line":906},[695,3923,946],{"class":715},[695,3925,903],{"class":719},[695,3927,3928],{"class":697,"line":943},[695,3929,784],{"emptyLinePlaceholder":783},[695,3931,3932,3934,3936,3938,3940],{"class":697,"line":1146},[695,3933,1043],{"class":811},[695,3935,1066],{"class":719},[695,3937,1049],{"class":715},[695,3939,824],{"class":796},[695,3941,3942],{"class":719},"(transport)\n",[1896,3944,3946],{"id":3945},"configuration-reference","Configuration reference",[3548,3948,3950],{"id":3949},"httpdrainconfig",[597,3951,3952],{},"HttpDrainConfig",[520,3954,3955,3965],{},[523,3956,3957],{},[526,3958,3959,3961,3963],{},[529,3960,1908],{},[529,3962,1911],{},[529,3964,1914],{},[536,3966,3967,3982,4003,4017,4035],{},[526,3968,3969,3974,3976],{},[541,3970,3971],{},[597,3972,3973],{},"endpoint",[541,3975,2033],{},[541,3977,3978,3981],{},[2684,3979,3980],{},"(required)"," Full URL of the server ingest endpoint",[526,3983,3984,3989,3991],{},[541,3985,3986],{},[597,3987,3988],{},"headers",[541,3990,2033],{},[541,3992,3993,3994,3996,3997,2219,4000,657],{},"Custom headers sent with each ",[597,3995,3524],{}," request (e.g. ",[597,3998,3999],{},"Authorization",[597,4001,4002],{},"X-API-Key",[526,4004,4005,4010,4014],{},[541,4006,4007],{},[597,4008,4009],{},"timeout",[541,4011,4012],{},[597,4013,1941],{},[541,4015,4016],{},"Request timeout in milliseconds",[526,4018,4019,4024,4029],{},[541,4020,4021],{},[597,4022,4023],{},"useBeacon",[541,4025,4026],{},[597,4027,4028],{},"true",[541,4030,4031,4032,4034],{},"Use ",[597,4033,3248],{}," when the page is hidden",[526,4036,4037,4042,4047],{},[541,4038,4039],{},[597,4040,4041],{},"credentials",[541,4043,4044],{},[597,4045,4046],{},"'same-origin'",[541,4048,4049,4050,2219,4053,2219,4055,4058,4059,4061],{},"Fetch credentials mode (",[597,4051,4052],{},"'omit'",[597,4054,4046],{},[597,4056,4057],{},"'include'","). Set to ",[597,4060,4057],{}," for cross-origin endpoints",[3548,4063,4065],{"id":4064},"httplogdrainoptions",[597,4066,4067],{},"HttpLogDrainOptions",[520,4069,4070,4080],{},[523,4071,4072],{},[526,4073,4074,4076,4078],{},[529,4075,1908],{},[529,4077,1911],{},[529,4079,1914],{},[536,4081,4082,4099,4114],{},[526,4083,4084,4089,4091],{},[541,4085,4086],{},[597,4087,4088],{},"drain",[541,4090,2033],{},[541,4092,4093,4095,4096,4098],{},[2684,4094,3980],{}," ",[597,4097,3952],{}," object",[526,4100,4101,4106,4111],{},[541,4102,4103],{},[597,4104,4105],{},"pipeline",[541,4107,4108],{},[597,4109,4110],{},"{ batch: { size: 25, intervalMs: 2000 }, retry: { maxAttempts: 2 } }",[541,4112,4113],{},"Pipeline configuration overrides",[526,4115,4116,4121,4125],{},[541,4117,4118],{},[597,4119,4120],{},"autoFlush",[541,4122,4123],{},[597,4124,4028],{},[541,4126,4127,4128,4130],{},"Auto-register ",[597,4129,3252],{}," flush listener",[1896,4132,4134],{"id":4133},"sendbeacon-fallback","sendBeacon fallback",[1530,4136,4138,4139,4141,4142,4144,4145,4147],{"color":3461,"icon":4137},"i-lucide-radio","When ",[597,4140,4023],{}," is enabled (the default) and the page becomes hidden, the drain automatically switches from ",[597,4143,3524],{}," to ",[597,4146,3535],{},". This ensures logs are delivered even when the user closes the tab or navigates away.",[507,4149,4150,4152],{},[597,4151,3248],{}," has a browser-imposed payload limit (~64 KB). If the payload exceeds this, the drain throws an error. Keep batch sizes reasonable (the default of 25 is well within limits).",[1896,4154,4156],{"id":4155},"authentication","Authentication",[507,4158,4159],{},"Pass custom headers to protect your ingest endpoint:",[685,4161,4163],{"className":687,"code":4162,"filename":3344,"language":690,"meta":691,"style":691},"const drain = createHttpLogDrain({\n  drain: {\n    endpoint: 'https:\u002F\u002Flogs.example.com\u002Fv1\u002Fingest',\n    headers: {\n      'Authorization': 'Bearer ' + token,\n    },\n  },\n})\n",[597,4164,4165,4179,4187,4202,4210,4236,4241,4245],{"__ignoreMap":691},[695,4166,4167,4169,4171,4173,4175,4177],{"class":697,"line":698},[695,4168,1043],{"class":811},[695,4170,1066],{"class":719},[695,4172,1049],{"class":715},[695,4174,3377],{"class":796},[695,4176,800],{"class":719},[695,4178,1118],{"class":715},[695,4180,4181,4183,4185],{"class":697,"line":705},[695,4182,1141],{"class":842},[695,4184,1126],{"class":715},[695,4186,815],{"class":715},[695,4188,4189,4192,4194,4196,4198,4200],{"class":697,"line":739},[695,4190,4191],{"class":842},"    endpoint",[695,4193,1126],{"class":715},[695,4195,729],{"class":715},[695,4197,3423],{"class":732},[695,4199,890],{"class":715},[695,4201,1136],{"class":715},[695,4203,4204,4206,4208],{"class":697,"line":759},[695,4205,3149],{"class":842},[695,4207,1126],{"class":715},[695,4209,815],{"class":715},[695,4211,4212,4215,4217,4219,4221,4223,4226,4228,4231,4234],{"class":697,"line":780},[695,4213,4214],{"class":715},"      '",[695,4216,3999],{"class":842},[695,4218,890],{"class":715},[695,4220,1126],{"class":715},[695,4222,729],{"class":715},[695,4224,4225],{"class":732},"Bearer ",[695,4227,890],{"class":715},[695,4229,4230],{"class":715}," +",[695,4232,4233],{"class":719}," token",[695,4235,1136],{"class":715},[695,4237,4238],{"class":697,"line":787},[695,4239,4240],{"class":715},"    },\n",[695,4242,4243],{"class":697,"line":818},[695,4244,1708],{"class":715},[695,4246,4247,4249],{"class":697,"line":846},[695,4248,946],{"class":715},[695,4250,903],{"class":719},[1530,4252,4253,4255,4256,4258,4259,4261,4262,4264,4265,4268,4269,3525,4271,877],{"color":1532,"icon":54},[597,4254,3988],{}," are applied to ",[597,4257,3524],{}," requests only. The ",[597,4260,3248],{}," API does not support custom headers, so when the page is hidden and ",[597,4263,3248],{}," is used, headers are not sent. If your endpoint requires authentication, validate via a session cookie (set ",[597,4266,4267],{},"credentials: 'include'"," for cross-origin endpoints) or disable ",[597,4270,3248],{},[597,4272,4273],{},"useBeacon: false",[1896,4275,4277],{"id":4276},"server-endpoint","Server endpoint",[507,4279,4280,4281,4283],{},"Your server needs a POST endpoint that accepts a ",[597,4282,3331],{}," JSON body. Examples for common frameworks:",[682,4285,4286,4428],{},[685,4287,4289],{"className":687,"code":4288,"filename":235,"language":690,"meta":691,"style":691},"app.post('\u002Fv1\u002Fingest', express.json(), (req, res) => {\n  for (const entry of req.body) {\n    console.log('[BROWSER]', JSON.stringify(entry))\n  }\n  res.sendStatus(204)\n})\n",[597,4290,4291,4340,4367,4400,4405,4422],{"__ignoreMap":691},[695,4292,4293,4295,4297,4300,4302,4304,4307,4309,4311,4314,4316,4319,4322,4324,4326,4329,4331,4334,4336,4338],{"class":697,"line":698},[695,4294,1288],{"class":719},[695,4296,877],{"class":715},[695,4298,4299],{"class":796},"post",[695,4301,800],{"class":719},[695,4303,890],{"class":715},[695,4305,4306],{"class":732},"\u002Fv1\u002Fingest",[695,4308,890],{"class":715},[695,4310,898],{"class":715},[695,4312,4313],{"class":719}," express",[695,4315,877],{"class":715},[695,4317,4318],{"class":796},"json",[695,4320,4321],{"class":719},"()",[695,4323,898],{"class":715},[695,4325,1796],{"class":715},[695,4327,4328],{"class":805},"req",[695,4330,898],{"class":715},[695,4332,4333],{"class":805}," res",[695,4335,657],{"class":715},[695,4337,812],{"class":811},[695,4339,815],{"class":715},[695,4341,4342,4345,4347,4349,4352,4355,4358,4360,4363,4365],{"class":697,"line":705},[695,4343,4344],{"class":708},"  for",[695,4346,1796],{"class":842},[695,4348,1043],{"class":811},[695,4350,4351],{"class":719}," entry",[695,4353,4354],{"class":715}," of",[695,4356,4357],{"class":719}," req",[695,4359,877],{"class":715},[695,4361,4362],{"class":719},"body",[695,4364,2885],{"class":842},[695,4366,1118],{"class":715},[695,4368,4369,4371,4373,4375,4377,4379,4382,4384,4386,4388,4390,4392,4394,4397],{"class":697,"line":739},[695,4370,1816],{"class":719},[695,4372,877],{"class":715},[695,4374,3456],{"class":796},[695,4376,800],{"class":842},[695,4378,890],{"class":715},[695,4380,4381],{"class":732},"[BROWSER]",[695,4383,890],{"class":715},[695,4385,898],{"class":715},[695,4387,3181],{"class":719},[695,4389,877],{"class":715},[695,4391,3186],{"class":796},[695,4393,800],{"class":842},[695,4395,4396],{"class":719},"entry",[695,4398,4399],{"class":842},"))\n",[695,4401,4402],{"class":697,"line":759},[695,4403,4404],{"class":715},"  }\n",[695,4406,4407,4410,4412,4415,4417,4420],{"class":697,"line":780},[695,4408,4409],{"class":719},"  res",[695,4411,877],{"class":715},[695,4413,4414],{"class":796},"sendStatus",[695,4416,800],{"class":842},[695,4418,4419],{"class":1682},"204",[695,4421,903],{"class":842},[695,4423,4424,4426],{"class":697,"line":787},[695,4425,946],{"class":715},[695,4427,903],{"class":719},[685,4429,4431],{"className":687,"code":4430,"filename":240,"language":690,"meta":691,"style":691},"app.post('\u002Fv1\u002Fingest', async (c) => {\n  const body = await c.req.json()\n  for (const entry of body) {\n    console.log('[BROWSER]', JSON.stringify(entry))\n  }\n  return c.body(null, 204)\n})\n",[597,4432,4433,4464,4488,4506,4536,4540,4561],{"__ignoreMap":691},[695,4434,4435,4437,4439,4441,4443,4445,4447,4449,4451,4454,4456,4458,4460,4462],{"class":697,"line":698},[695,4436,1288],{"class":719},[695,4438,877],{"class":715},[695,4440,4299],{"class":796},[695,4442,800],{"class":719},[695,4444,890],{"class":715},[695,4446,4306],{"class":732},[695,4448,890],{"class":715},[695,4450,898],{"class":715},[695,4452,4453],{"class":811}," async",[695,4455,1796],{"class":715},[695,4457,2836],{"class":805},[695,4459,657],{"class":715},[695,4461,812],{"class":811},[695,4463,815],{"class":715},[695,4465,4466,4468,4471,4473,4476,4478,4480,4482,4484,4486],{"class":697,"line":705},[695,4467,821],{"class":811},[695,4469,4470],{"class":719}," body",[695,4472,827],{"class":715},[695,4474,4475],{"class":708}," await",[695,4477,2841],{"class":719},[695,4479,877],{"class":715},[695,4481,4328],{"class":719},[695,4483,877],{"class":715},[695,4485,4318],{"class":796},[695,4487,843],{"class":842},[695,4489,4490,4492,4494,4496,4498,4500,4502,4504],{"class":697,"line":739},[695,4491,4344],{"class":708},[695,4493,1796],{"class":842},[695,4495,1043],{"class":811},[695,4497,4351],{"class":719},[695,4499,4354],{"class":715},[695,4501,4470],{"class":719},[695,4503,2885],{"class":842},[695,4505,1118],{"class":715},[695,4507,4508,4510,4512,4514,4516,4518,4520,4522,4524,4526,4528,4530,4532,4534],{"class":697,"line":759},[695,4509,1816],{"class":719},[695,4511,877],{"class":715},[695,4513,3456],{"class":796},[695,4515,800],{"class":842},[695,4517,890],{"class":715},[695,4519,4381],{"class":732},[695,4521,890],{"class":715},[695,4523,898],{"class":715},[695,4525,3181],{"class":719},[695,4527,877],{"class":715},[695,4529,3186],{"class":796},[695,4531,800],{"class":842},[695,4533,4396],{"class":719},[695,4535,4399],{"class":842},[695,4537,4538],{"class":697,"line":780},[695,4539,4404],{"class":715},[695,4541,4542,4545,4547,4549,4551,4553,4556,4559],{"class":697,"line":787},[695,4543,4544],{"class":708},"  return",[695,4546,2841],{"class":719},[695,4548,877],{"class":715},[695,4550,4362],{"class":796},[695,4552,800],{"class":842},[695,4554,4555],{"class":715},"null,",[695,4557,4558],{"class":1682}," 204",[695,4560,903],{"class":842},[695,4562,4563,4565],{"class":697,"line":818},[695,4564,946],{"class":715},[695,4566,903],{"class":719},[507,4568,4569,4570,4575],{},"See the full ",[511,4571,4574],{"href":4572,"rel":4573},"https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog\u002Ftree\u002Fmain\u002Fexamples\u002Fbrowser",[668],"browser example"," for a working Hono server + browser page.",[675,4577,4579],{"id":4578},"common-pitfalls","Common pitfalls",[590,4581,4582,4590,4598,4604],{},[593,4583,4584,4589],{},[2684,4585,2241,4586,4588],{},[597,4587,644],{}," on shutdown"," — buffered events are lost otherwise",[593,4591,4592,4597],{},[2684,4593,2216,4594,4596],{},[597,4595,1558],{}," to match your provider's recommended payload"," — too small wastes overhead, too big risks rejection",[593,4599,4600,4603],{},[2684,4601,4602],{},"Don't run one pipeline per drain unless you need per-destination retries"," — sharing one pipeline keeps batching + buffering coherent",[593,4605,4606,4609,4610,4613],{},[2684,4607,4608],{},"Don't fan out to a serverless-incompatible target without checking"," — the ",[511,4611,4612],{"href":426},"stream server"," reaches every connected client through the in-process stream; it's not a drain",[675,4615,4617],{"id":4616},"next-steps","Next steps",[590,4619,4620,4631,4637,4642],{},[593,4621,4622,4625,4626,2234,4628],{},[511,4623,4624],{"href":462},"Custom Drains"," — build a drain for any backend with ",[597,4627,3234],{},[597,4629,4630],{},"defineDrain",[593,4632,4633,4636],{},[511,4634,4635],{"href":133},"Adapters Overview"," — built-in adapters that work with the pipeline out of the box",[593,4638,4639,4641],{},[511,4640,488],{"href":489}," — security and production tips",[593,4643,4644,4647],{},[511,4645,4646],{"href":293},"Client logging"," — end-to-end browser → server flow",[4649,4650,4651],"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":691,"searchDepth":705,"depth":705,"links":4653},[4654,4655,4656,4661,4666,4667,4676,4677],{"id":677,"depth":705,"text":549},{"id":1548,"depth":705,"text":1549},{"id":1577,"depth":705,"text":475,"children":4657},[4658,4659,4660],{"id":1898,"depth":739,"text":1899},{"id":2039,"depth":739,"text":2040},{"id":2098,"depth":739,"text":2099},{"id":2169,"depth":705,"text":560,"children":4662},[4663,4664,4665],{"id":2252,"depth":739,"text":2253},{"id":2677,"depth":739,"text":2678},{"id":2704,"depth":739,"text":2705},{"id":2987,"depth":705,"text":2988},{"id":3238,"depth":705,"text":570,"children":4668},[4669,4670,4671,4672,4673,4674,4675],{"id":3340,"depth":739,"text":549},{"id":3499,"depth":739,"text":3500},{"id":3545,"depth":739,"text":3546},{"id":3945,"depth":739,"text":3946},{"id":4133,"depth":739,"text":4134},{"id":4155,"depth":739,"text":4156},{"id":4276,"depth":739,"text":4277},{"id":4578,"depth":705,"text":4579},{"id":4616,"depth":705,"text":4617},"Batch events, retry on failure, fan out to multiple destinations, and ship browser logs to your server. The shared pipeline that wraps every drain in production.","md",[4681,4683],{"label":4624,"icon":464,"to":462,"color":3256,"variant":4682},"subtle",{"label":4635,"icon":4684,"to":133,"color":3256,"variant":4682},"i-custom-plug",{},{"title":466,"icon":469},{"title":502,"description":4678},"S_LbDuioqxiShbUAlf0dO6eMr_8hHKsO2LOaP3xjCKg",[4690,4692],{"title":461,"path":462,"stem":463,"description":4691,"icon":464,"children":-1},"Build a drain for any backend without a built-in adapter — defineHttpDrain for HTTP destinations, defineDrain for any other transport. Standardized config resolution, retries, timeouts, and identity headers handled for you.",{"title":475,"path":476,"stem":477,"description":4693,"icon":478,"children":-1},"Complete reference for all evlog configuration options including global logger settings, middleware options, environment context, and framework-specific overrides.",1785016756984]