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