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