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