[{"data":1,"prerenderedAt":2965},["ShallowReactive",2],{"navigation_docs":3,"-adapters-building-blocks-toolkit":547,"-adapters-building-blocks-toolkit-surround":2960},[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":2950,"extension":2951,"links":2952,"meta":2956,"navigation":2957,"path":528,"seo":2958,"stem":529,"__hash__":2959},"docs\u002F6.adapters\u002F04.building-blocks\u002F04.toolkit.md","Toolkit Reference",{"type":551,"value":552,"toc":2932},"minimark",[553,561,572,577,942,946,952,1452,1467,1472,1560,1567,2099,2104,2111,2281,2288,2295,2485,2492,2503,2507,2686,2693,2697,2851,2855,2858,2866,2876,2888,2892,2928],[554,555,556,560],"p",{},[557,558,559],"code",{},"evlog\u002Ftoolkit"," is the public surface that every built-in adapter, enricher, and framework integration is built on. If you're publishing a community package on top of evlog, this is your entry point.",[562,563,566,567,571],"callout",{"color":564,"icon":565},"warning","i-lucide-flask-conical","The toolkit is marked as ",[568,569,570],"strong",{},"beta",". The shape is stable (used in production by every built-in) and follows semver — but breaking changes are still possible while community usage validates the surface.",[573,574,576],"h2",{"id":575},"quick-reference","Quick Reference",[578,579,584],"pre",{"className":580,"code":581,"language":582,"meta":583,"style":583},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import {\n  \u002F\u002F Plugins — the unified extension contract\n  definePlugin,\n  drainPlugin,\n  enricherPlugin,\n  composePlugins,\n\n  \u002F\u002F Drains\n  defineDrain,\n  defineHttpDrain,\n  composeDrains,\n\n  \u002F\u002F Enrichers\n  defineEnricher,\n  composeEnrichers,\n\n  \u002F\u002F Tail sampling\n  composeKeep,\n\n  \u002F\u002F Configuration\n  defineEvlog,\n  toLoggerConfig,\n  toMiddlewareOptions,\n  resolveAdapterConfig,\n  type ConfigField,\n\n  \u002F\u002F Framework integrations\n  defineFrameworkIntegration,\n  createMiddlewareLogger,\n  createLoggerStorage,\n  type BaseEvlogOptions,\n\n  \u002F\u002F HTTP transport\n  httpPost,\n\n  \u002F\u002F Helpers\n  getHeader,\n  normalizeNumber,\n  extractSafeHeaders,\n  extractSafeNodeHeaders,\n  mergeEventField,\n  toTypedAttributeValue,\n  toOtlpAttributeValue,\n  OTEL_SEVERITY_NUMBER,\n  OTEL_SEVERITY_TEXT,\n} from 'evlog\u002Ftoolkit'\n","typescript","",[557,585,586,599,606,616,624,632,640,647,653,661,669,677,682,688,696,704,709,715,723,728,734,742,750,758,766,777,782,788,796,804,812,822,827,833,841,846,852,860,868,876,884,892,900,908,916,924],{"__ignoreMap":583},[587,588,591,595],"span",{"class":589,"line":590},"line",1,[587,592,594],{"class":593},"s7zQu","import",[587,596,598],{"class":597},"sMK4o"," {\n",[587,600,602],{"class":589,"line":601},2,[587,603,605],{"class":604},"sHwdD","  \u002F\u002F Plugins — the unified extension contract\n",[587,607,609,613],{"class":589,"line":608},3,[587,610,612],{"class":611},"sTEyZ","  definePlugin",[587,614,615],{"class":597},",\n",[587,617,619,622],{"class":589,"line":618},4,[587,620,621],{"class":611},"  drainPlugin",[587,623,615],{"class":597},[587,625,627,630],{"class":589,"line":626},5,[587,628,629],{"class":611},"  enricherPlugin",[587,631,615],{"class":597},[587,633,635,638],{"class":589,"line":634},6,[587,636,637],{"class":611},"  composePlugins",[587,639,615],{"class":597},[587,641,643],{"class":589,"line":642},7,[587,644,646],{"emptyLinePlaceholder":645},true,"\n",[587,648,650],{"class":589,"line":649},8,[587,651,652],{"class":604},"  \u002F\u002F Drains\n",[587,654,656,659],{"class":589,"line":655},9,[587,657,658],{"class":611},"  defineDrain",[587,660,615],{"class":597},[587,662,664,667],{"class":589,"line":663},10,[587,665,666],{"class":611},"  defineHttpDrain",[587,668,615],{"class":597},[587,670,672,675],{"class":589,"line":671},11,[587,673,674],{"class":611},"  composeDrains",[587,676,615],{"class":597},[587,678,680],{"class":589,"line":679},12,[587,681,646],{"emptyLinePlaceholder":645},[587,683,685],{"class":589,"line":684},13,[587,686,687],{"class":604},"  \u002F\u002F Enrichers\n",[587,689,691,694],{"class":589,"line":690},14,[587,692,693],{"class":611},"  defineEnricher",[587,695,615],{"class":597},[587,697,699,702],{"class":589,"line":698},15,[587,700,701],{"class":611},"  composeEnrichers",[587,703,615],{"class":597},[587,705,707],{"class":589,"line":706},16,[587,708,646],{"emptyLinePlaceholder":645},[587,710,712],{"class":589,"line":711},17,[587,713,714],{"class":604},"  \u002F\u002F Tail sampling\n",[587,716,718,721],{"class":589,"line":717},18,[587,719,720],{"class":611},"  composeKeep",[587,722,615],{"class":597},[587,724,726],{"class":589,"line":725},19,[587,727,646],{"emptyLinePlaceholder":645},[587,729,731],{"class":589,"line":730},20,[587,732,733],{"class":604},"  \u002F\u002F Configuration\n",[587,735,737,740],{"class":589,"line":736},21,[587,738,739],{"class":611},"  defineEvlog",[587,741,615],{"class":597},[587,743,745,748],{"class":589,"line":744},22,[587,746,747],{"class":611},"  toLoggerConfig",[587,749,615],{"class":597},[587,751,753,756],{"class":589,"line":752},23,[587,754,755],{"class":611},"  toMiddlewareOptions",[587,757,615],{"class":597},[587,759,761,764],{"class":589,"line":760},24,[587,762,763],{"class":611},"  resolveAdapterConfig",[587,765,615],{"class":597},[587,767,769,772,775],{"class":589,"line":768},25,[587,770,771],{"class":593},"  type",[587,773,774],{"class":611}," ConfigField",[587,776,615],{"class":597},[587,778,780],{"class":589,"line":779},26,[587,781,646],{"emptyLinePlaceholder":645},[587,783,785],{"class":589,"line":784},27,[587,786,787],{"class":604},"  \u002F\u002F Framework integrations\n",[587,789,791,794],{"class":589,"line":790},28,[587,792,793],{"class":611},"  defineFrameworkIntegration",[587,795,615],{"class":597},[587,797,799,802],{"class":589,"line":798},29,[587,800,801],{"class":611},"  createMiddlewareLogger",[587,803,615],{"class":597},[587,805,807,810],{"class":589,"line":806},30,[587,808,809],{"class":611},"  createLoggerStorage",[587,811,615],{"class":597},[587,813,815,817,820],{"class":589,"line":814},31,[587,816,771],{"class":593},[587,818,819],{"class":611}," BaseEvlogOptions",[587,821,615],{"class":597},[587,823,825],{"class":589,"line":824},32,[587,826,646],{"emptyLinePlaceholder":645},[587,828,830],{"class":589,"line":829},33,[587,831,832],{"class":604},"  \u002F\u002F HTTP transport\n",[587,834,836,839],{"class":589,"line":835},34,[587,837,838],{"class":611},"  httpPost",[587,840,615],{"class":597},[587,842,844],{"class":589,"line":843},35,[587,845,646],{"emptyLinePlaceholder":645},[587,847,849],{"class":589,"line":848},36,[587,850,851],{"class":604},"  \u002F\u002F Helpers\n",[587,853,855,858],{"class":589,"line":854},37,[587,856,857],{"class":611},"  getHeader",[587,859,615],{"class":597},[587,861,863,866],{"class":589,"line":862},38,[587,864,865],{"class":611},"  normalizeNumber",[587,867,615],{"class":597},[587,869,871,874],{"class":589,"line":870},39,[587,872,873],{"class":611},"  extractSafeHeaders",[587,875,615],{"class":597},[587,877,879,882],{"class":589,"line":878},40,[587,880,881],{"class":611},"  extractSafeNodeHeaders",[587,883,615],{"class":597},[587,885,887,890],{"class":589,"line":886},41,[587,888,889],{"class":611},"  mergeEventField",[587,891,615],{"class":597},[587,893,895,898],{"class":589,"line":894},42,[587,896,897],{"class":611},"  toTypedAttributeValue",[587,899,615],{"class":597},[587,901,903,906],{"class":589,"line":902},43,[587,904,905],{"class":611},"  toOtlpAttributeValue",[587,907,615],{"class":597},[587,909,911,914],{"class":589,"line":910},44,[587,912,913],{"class":611},"  OTEL_SEVERITY_NUMBER",[587,915,615],{"class":597},[587,917,919,922],{"class":589,"line":918},45,[587,920,921],{"class":611},"  OTEL_SEVERITY_TEXT",[587,923,615],{"class":597},[587,925,927,930,933,936,939],{"class":589,"line":926},46,[587,928,929],{"class":597},"}",[587,931,932],{"class":593}," from",[587,934,935],{"class":597}," '",[587,937,559],{"class":938},"sfazB",[587,940,941],{"class":597},"'\n",[573,943,945],{"id":944},"the-plugin-contract","The plugin contract",[554,947,948,951],{},[557,949,950],{},"definePlugin"," is the canonical extension contract. Drains and enrichers are sugar over it.",[578,953,955],{"className":580,"code":954,"language":582,"meta":583,"style":583},"import { definePlugin } from 'evlog\u002Ftoolkit'\n\nconst requestMetricsPlugin = definePlugin({\n  name: 'request-metrics',\n\n  setup({ env }) {\n    statsd.init({ service: env.service })\n  },\n\n  enrich({ event }) {\n    event.tier = event.duration && event.duration > 1000 ? 'slow' : 'fast'\n  },\n\n  drain({ event }) {\n    statsd.timing('http.request', event.duration as number, { path: event.path as string })\n  },\n\n  onRequestStart({ logger, request }) {\n    logger.set({ trace: { startedAt: Date.now() } })\n  },\n\n  onRequestFinish({ event, durationMs }) {\n    if (event && (event.level === 'error' || durationMs > 5000)) {\n      \u002F\u002F alert \u002F forward \u002F etc.\n    }\n  },\n\n  onClientLog({ event }) {\n    \u002F\u002F Hook into client-side logs received via \u002Fapi\u002F_evlog\u002Fingest\n  },\n\n  extendLogger(logger) {\n    \u002F\u002F Add custom typed methods to RequestLogger here\n  },\n})\n",[557,956,957,978,982,1003,1022,1026,1043,1076,1081,1085,1099,1155,1159,1163,1176,1235,1239,1243,1262,1305,1309,1313,1331,1378,1383,1388,1392,1396,1409,1414,1418,1422,1437,1442,1446],{"__ignoreMap":583},[587,958,959,961,964,967,970,972,974,976],{"class":589,"line":590},[587,960,594],{"class":593},[587,962,963],{"class":597}," {",[587,965,966],{"class":611}," definePlugin",[587,968,969],{"class":597}," }",[587,971,932],{"class":593},[587,973,935],{"class":597},[587,975,559],{"class":938},[587,977,941],{"class":597},[587,979,980],{"class":589,"line":601},[587,981,646],{"emptyLinePlaceholder":645},[587,983,984,988,991,994,997,1000],{"class":589,"line":608},[587,985,987],{"class":986},"spNyl","const",[587,989,990],{"class":611}," requestMetricsPlugin ",[587,992,993],{"class":597},"=",[587,995,966],{"class":996},"s2Zo4",[587,998,999],{"class":611},"(",[587,1001,1002],{"class":597},"{\n",[587,1004,1005,1009,1012,1014,1017,1020],{"class":589,"line":618},[587,1006,1008],{"class":1007},"swJcz","  name",[587,1010,1011],{"class":597},":",[587,1013,935],{"class":597},[587,1015,1016],{"class":938},"request-metrics",[587,1018,1019],{"class":597},"'",[587,1021,615],{"class":597},[587,1023,1024],{"class":589,"line":626},[587,1025,646],{"emptyLinePlaceholder":645},[587,1027,1028,1031,1034,1038,1041],{"class":589,"line":634},[587,1029,1030],{"class":1007},"  setup",[587,1032,1033],{"class":597},"({",[587,1035,1037],{"class":1036},"sHdIc"," env",[587,1039,1040],{"class":597}," })",[587,1042,598],{"class":597},[587,1044,1045,1048,1051,1054,1056,1059,1062,1064,1066,1068,1071,1073],{"class":589,"line":642},[587,1046,1047],{"class":611},"    statsd",[587,1049,1050],{"class":597},".",[587,1052,1053],{"class":996},"init",[587,1055,999],{"class":1007},[587,1057,1058],{"class":597},"{",[587,1060,1061],{"class":1007}," service",[587,1063,1011],{"class":597},[587,1065,1037],{"class":611},[587,1067,1050],{"class":597},[587,1069,1070],{"class":611},"service",[587,1072,969],{"class":597},[587,1074,1075],{"class":1007},")\n",[587,1077,1078],{"class":589,"line":649},[587,1079,1080],{"class":597},"  },\n",[587,1082,1083],{"class":589,"line":655},[587,1084,646],{"emptyLinePlaceholder":645},[587,1086,1087,1090,1092,1095,1097],{"class":589,"line":663},[587,1088,1089],{"class":1007},"  enrich",[587,1091,1033],{"class":597},[587,1093,1094],{"class":1036}," event",[587,1096,1040],{"class":597},[587,1098,598],{"class":597},[587,1100,1101,1104,1106,1109,1112,1114,1116,1119,1122,1124,1126,1128,1131,1135,1138,1140,1143,1145,1148,1150,1153],{"class":589,"line":671},[587,1102,1103],{"class":611},"    event",[587,1105,1050],{"class":597},[587,1107,1108],{"class":611},"tier",[587,1110,1111],{"class":597}," =",[587,1113,1094],{"class":611},[587,1115,1050],{"class":597},[587,1117,1118],{"class":611},"duration",[587,1120,1121],{"class":597}," &&",[587,1123,1094],{"class":611},[587,1125,1050],{"class":597},[587,1127,1118],{"class":611},[587,1129,1130],{"class":597}," >",[587,1132,1134],{"class":1133},"sbssI"," 1000",[587,1136,1137],{"class":597}," ?",[587,1139,935],{"class":597},[587,1141,1142],{"class":938},"slow",[587,1144,1019],{"class":597},[587,1146,1147],{"class":597}," :",[587,1149,935],{"class":597},[587,1151,1152],{"class":938},"fast",[587,1154,941],{"class":597},[587,1156,1157],{"class":589,"line":679},[587,1158,1080],{"class":597},[587,1160,1161],{"class":589,"line":684},[587,1162,646],{"emptyLinePlaceholder":645},[587,1164,1165,1168,1170,1172,1174],{"class":589,"line":690},[587,1166,1167],{"class":1007},"  drain",[587,1169,1033],{"class":597},[587,1171,1094],{"class":1036},[587,1173,1040],{"class":597},[587,1175,598],{"class":597},[587,1177,1178,1180,1182,1185,1187,1189,1192,1194,1197,1199,1201,1203,1206,1210,1212,1214,1217,1219,1221,1223,1226,1228,1231,1233],{"class":589,"line":698},[587,1179,1047],{"class":611},[587,1181,1050],{"class":597},[587,1183,1184],{"class":996},"timing",[587,1186,999],{"class":1007},[587,1188,1019],{"class":597},[587,1190,1191],{"class":938},"http.request",[587,1193,1019],{"class":597},[587,1195,1196],{"class":597},",",[587,1198,1094],{"class":611},[587,1200,1050],{"class":597},[587,1202,1118],{"class":611},[587,1204,1205],{"class":593}," as",[587,1207,1209],{"class":1208},"sBMFI"," number",[587,1211,1196],{"class":597},[587,1213,963],{"class":597},[587,1215,1216],{"class":1007}," path",[587,1218,1011],{"class":597},[587,1220,1094],{"class":611},[587,1222,1050],{"class":597},[587,1224,1225],{"class":611},"path",[587,1227,1205],{"class":593},[587,1229,1230],{"class":1208}," string",[587,1232,969],{"class":597},[587,1234,1075],{"class":1007},[587,1236,1237],{"class":589,"line":706},[587,1238,1080],{"class":597},[587,1240,1241],{"class":589,"line":711},[587,1242,646],{"emptyLinePlaceholder":645},[587,1244,1245,1248,1250,1253,1255,1258,1260],{"class":589,"line":717},[587,1246,1247],{"class":1007},"  onRequestStart",[587,1249,1033],{"class":597},[587,1251,1252],{"class":1036}," logger",[587,1254,1196],{"class":597},[587,1256,1257],{"class":1036}," request",[587,1259,1040],{"class":597},[587,1261,598],{"class":597},[587,1263,1264,1267,1269,1272,1274,1276,1279,1281,1283,1286,1288,1291,1293,1296,1299,1301,1303],{"class":589,"line":725},[587,1265,1266],{"class":611},"    logger",[587,1268,1050],{"class":597},[587,1270,1271],{"class":996},"set",[587,1273,999],{"class":1007},[587,1275,1058],{"class":597},[587,1277,1278],{"class":1007}," trace",[587,1280,1011],{"class":597},[587,1282,963],{"class":597},[587,1284,1285],{"class":1007}," startedAt",[587,1287,1011],{"class":597},[587,1289,1290],{"class":611}," Date",[587,1292,1050],{"class":597},[587,1294,1295],{"class":996},"now",[587,1297,1298],{"class":1007},"() ",[587,1300,929],{"class":597},[587,1302,969],{"class":597},[587,1304,1075],{"class":1007},[587,1306,1307],{"class":589,"line":730},[587,1308,1080],{"class":597},[587,1310,1311],{"class":589,"line":736},[587,1312,646],{"emptyLinePlaceholder":645},[587,1314,1315,1318,1320,1322,1324,1327,1329],{"class":589,"line":744},[587,1316,1317],{"class":1007},"  onRequestFinish",[587,1319,1033],{"class":597},[587,1321,1094],{"class":1036},[587,1323,1196],{"class":597},[587,1325,1326],{"class":1036}," durationMs",[587,1328,1040],{"class":597},[587,1330,598],{"class":597},[587,1332,1333,1336,1339,1342,1344,1346,1348,1350,1353,1356,1358,1361,1363,1366,1368,1370,1373,1376],{"class":589,"line":752},[587,1334,1335],{"class":593},"    if",[587,1337,1338],{"class":1007}," (",[587,1340,1341],{"class":611},"event",[587,1343,1121],{"class":597},[587,1345,1338],{"class":1007},[587,1347,1341],{"class":611},[587,1349,1050],{"class":597},[587,1351,1352],{"class":611},"level",[587,1354,1355],{"class":597}," ===",[587,1357,935],{"class":597},[587,1359,1360],{"class":938},"error",[587,1362,1019],{"class":597},[587,1364,1365],{"class":597}," ||",[587,1367,1326],{"class":611},[587,1369,1130],{"class":597},[587,1371,1372],{"class":1133}," 5000",[587,1374,1375],{"class":1007},")) ",[587,1377,1002],{"class":597},[587,1379,1380],{"class":589,"line":760},[587,1381,1382],{"class":604},"      \u002F\u002F alert \u002F forward \u002F etc.\n",[587,1384,1385],{"class":589,"line":768},[587,1386,1387],{"class":597},"    }\n",[587,1389,1390],{"class":589,"line":779},[587,1391,1080],{"class":597},[587,1393,1394],{"class":589,"line":784},[587,1395,646],{"emptyLinePlaceholder":645},[587,1397,1398,1401,1403,1405,1407],{"class":589,"line":790},[587,1399,1400],{"class":1007},"  onClientLog",[587,1402,1033],{"class":597},[587,1404,1094],{"class":1036},[587,1406,1040],{"class":597},[587,1408,598],{"class":597},[587,1410,1411],{"class":589,"line":798},[587,1412,1413],{"class":604},"    \u002F\u002F Hook into client-side logs received via \u002Fapi\u002F_evlog\u002Fingest\n",[587,1415,1416],{"class":589,"line":806},[587,1417,1080],{"class":597},[587,1419,1420],{"class":589,"line":814},[587,1421,646],{"emptyLinePlaceholder":645},[587,1423,1424,1427,1429,1432,1435],{"class":589,"line":824},[587,1425,1426],{"class":1007},"  extendLogger",[587,1428,999],{"class":597},[587,1430,1431],{"class":1036},"logger",[587,1433,1434],{"class":597},")",[587,1436,598],{"class":597},[587,1438,1439],{"class":589,"line":829},[587,1440,1441],{"class":604},"    \u002F\u002F Add custom typed methods to RequestLogger here\n",[587,1443,1444],{"class":589,"line":835},[587,1445,1080],{"class":597},[587,1447,1448,1450],{"class":589,"line":843},[587,1449,929],{"class":597},[587,1451,1075],{"class":611},[554,1453,1454,1455,1458,1459,1462,1463,1466],{},"Register it once via ",[557,1456,1457],{},"defineEvlog({ plugins: [requestMetricsPlugin] })"," or scoped per-middleware via ",[557,1460,1461],{},"evlog({ plugins: [requestMetricsPlugin] })",". Plugins run in registration order; errors in any hook are isolated and logged with the ",[557,1464,1465],{},"[evlog\u002F\u003Cname>]"," prefix.",[1468,1469,1471],"h3",{"id":1470},"sugar-plugins","Sugar plugins",[578,1473,1475],{"className":580,"code":1474,"language":582,"meta":583,"style":583},"import { drainPlugin, enricherPlugin } from 'evlog\u002Ftoolkit'\n\nconst drainOnly = drainPlugin('axiom', createAxiomDrain())\nconst enricherOnly = enricherPlugin('user-agent', createUserAgentEnricher())\n",[557,1476,1477,1501,1505,1533],{"__ignoreMap":583},[587,1478,1479,1481,1483,1486,1488,1491,1493,1495,1497,1499],{"class":589,"line":590},[587,1480,594],{"class":593},[587,1482,963],{"class":597},[587,1484,1485],{"class":611}," drainPlugin",[587,1487,1196],{"class":597},[587,1489,1490],{"class":611}," enricherPlugin",[587,1492,969],{"class":597},[587,1494,932],{"class":593},[587,1496,935],{"class":597},[587,1498,559],{"class":938},[587,1500,941],{"class":597},[587,1502,1503],{"class":589,"line":601},[587,1504,646],{"emptyLinePlaceholder":645},[587,1506,1507,1509,1512,1514,1516,1518,1520,1523,1525,1527,1530],{"class":589,"line":608},[587,1508,987],{"class":986},[587,1510,1511],{"class":611}," drainOnly ",[587,1513,993],{"class":597},[587,1515,1485],{"class":996},[587,1517,999],{"class":611},[587,1519,1019],{"class":597},[587,1521,1522],{"class":938},"axiom",[587,1524,1019],{"class":597},[587,1526,1196],{"class":597},[587,1528,1529],{"class":996}," createAxiomDrain",[587,1531,1532],{"class":611},"())\n",[587,1534,1535,1537,1540,1542,1544,1546,1548,1551,1553,1555,1558],{"class":589,"line":618},[587,1536,987],{"class":986},[587,1538,1539],{"class":611}," enricherOnly ",[587,1541,993],{"class":597},[587,1543,1490],{"class":996},[587,1545,999],{"class":611},[587,1547,1019],{"class":597},[587,1549,1550],{"class":938},"user-agent",[587,1552,1019],{"class":597},[587,1554,1196],{"class":597},[587,1556,1557],{"class":996}," createUserAgentEnricher",[587,1559,1532],{"class":611},[573,1561,1563,1566],{"id":1562},"definehttpdrain-the-adapter-recipe",[557,1564,1565],{},"defineHttpDrain"," — the adapter recipe",[578,1568,1570],{"className":580,"code":1569,"language":582,"meta":583,"style":583},"import {\n  defineHttpDrain,\n  resolveAdapterConfig,\n  type ConfigField,\n} from 'evlog\u002Ftoolkit'\n\ninterface AcmeConfig {\n  apiKey: string\n  endpoint?: string\n  timeout?: number\n}\n\nconst FIELDS: ConfigField\u003CAcmeConfig>[] = [\n  { key: 'apiKey', env: ['ACME_API_KEY'] },\n  { key: 'endpoint', env: ['ACME_ENDPOINT'] },\n  { key: 'timeout' },\n]\n\nexport function createAcmeDrain(overrides?: Partial\u003CAcmeConfig>) {\n  return defineHttpDrain\u003CAcmeConfig>({\n    name: 'acme',\n    resolve: async () => {\n      const cfg = await resolveAdapterConfig\u003CAcmeConfig>('acme', FIELDS, overrides)\n      return cfg.apiKey ? cfg as AcmeConfig : null\n    },\n    encode: (events, cfg) => ({\n      url: `${cfg.endpoint ?? 'https:\u002F\u002Fapi.acme.com'}\u002Fv1\u002Fingest`,\n      headers: { 'Content-Type': 'application\u002Fjson', Authorization: `Bearer ${cfg.apiKey}` },\n      body: JSON.stringify(events),\n    }),\n  })\n}\n",[557,1571,1572,1578,1584,1590,1598,1610,1614,1624,1634,1644,1654,1659,1663,1691,1730,1764,1782,1787,1791,1821,1839,1855,1873,1914,1938,1943,1967,2004,2056,2079,2088,2095],{"__ignoreMap":583},[587,1573,1574,1576],{"class":589,"line":590},[587,1575,594],{"class":593},[587,1577,598],{"class":597},[587,1579,1580,1582],{"class":589,"line":601},[587,1581,666],{"class":611},[587,1583,615],{"class":597},[587,1585,1586,1588],{"class":589,"line":608},[587,1587,763],{"class":611},[587,1589,615],{"class":597},[587,1591,1592,1594,1596],{"class":589,"line":618},[587,1593,771],{"class":593},[587,1595,774],{"class":611},[587,1597,615],{"class":597},[587,1599,1600,1602,1604,1606,1608],{"class":589,"line":626},[587,1601,929],{"class":597},[587,1603,932],{"class":593},[587,1605,935],{"class":597},[587,1607,559],{"class":938},[587,1609,941],{"class":597},[587,1611,1612],{"class":589,"line":634},[587,1613,646],{"emptyLinePlaceholder":645},[587,1615,1616,1619,1622],{"class":589,"line":642},[587,1617,1618],{"class":986},"interface",[587,1620,1621],{"class":1208}," AcmeConfig",[587,1623,598],{"class":597},[587,1625,1626,1629,1631],{"class":589,"line":649},[587,1627,1628],{"class":1007},"  apiKey",[587,1630,1011],{"class":597},[587,1632,1633],{"class":1208}," string\n",[587,1635,1636,1639,1642],{"class":589,"line":655},[587,1637,1638],{"class":1007},"  endpoint",[587,1640,1641],{"class":597},"?:",[587,1643,1633],{"class":1208},[587,1645,1646,1649,1651],{"class":589,"line":663},[587,1647,1648],{"class":1007},"  timeout",[587,1650,1641],{"class":597},[587,1652,1653],{"class":1208}," number\n",[587,1655,1656],{"class":589,"line":671},[587,1657,1658],{"class":597},"}\n",[587,1660,1661],{"class":589,"line":679},[587,1662,646],{"emptyLinePlaceholder":645},[587,1664,1665,1667,1670,1672,1674,1677,1680,1683,1686,1688],{"class":589,"line":684},[587,1666,987],{"class":986},[587,1668,1669],{"class":611}," FIELDS",[587,1671,1011],{"class":597},[587,1673,774],{"class":1208},[587,1675,1676],{"class":597},"\u003C",[587,1678,1679],{"class":1208},"AcmeConfig",[587,1681,1682],{"class":597},">",[587,1684,1685],{"class":611},"[] ",[587,1687,993],{"class":597},[587,1689,1690],{"class":611}," [\n",[587,1692,1693,1696,1699,1701,1703,1706,1708,1710,1712,1714,1717,1719,1722,1724,1727],{"class":589,"line":690},[587,1694,1695],{"class":597},"  {",[587,1697,1698],{"class":1007}," key",[587,1700,1011],{"class":597},[587,1702,935],{"class":597},[587,1704,1705],{"class":938},"apiKey",[587,1707,1019],{"class":597},[587,1709,1196],{"class":597},[587,1711,1037],{"class":1007},[587,1713,1011],{"class":597},[587,1715,1716],{"class":611}," [",[587,1718,1019],{"class":597},[587,1720,1721],{"class":938},"ACME_API_KEY",[587,1723,1019],{"class":597},[587,1725,1726],{"class":611},"] ",[587,1728,1729],{"class":597},"},\n",[587,1731,1732,1734,1736,1738,1740,1743,1745,1747,1749,1751,1753,1755,1758,1760,1762],{"class":589,"line":698},[587,1733,1695],{"class":597},[587,1735,1698],{"class":1007},[587,1737,1011],{"class":597},[587,1739,935],{"class":597},[587,1741,1742],{"class":938},"endpoint",[587,1744,1019],{"class":597},[587,1746,1196],{"class":597},[587,1748,1037],{"class":1007},[587,1750,1011],{"class":597},[587,1752,1716],{"class":611},[587,1754,1019],{"class":597},[587,1756,1757],{"class":938},"ACME_ENDPOINT",[587,1759,1019],{"class":597},[587,1761,1726],{"class":611},[587,1763,1729],{"class":597},[587,1765,1766,1768,1770,1772,1774,1777,1779],{"class":589,"line":706},[587,1767,1695],{"class":597},[587,1769,1698],{"class":1007},[587,1771,1011],{"class":597},[587,1773,935],{"class":597},[587,1775,1776],{"class":938},"timeout",[587,1778,1019],{"class":597},[587,1780,1781],{"class":597}," },\n",[587,1783,1784],{"class":589,"line":711},[587,1785,1786],{"class":611},"]\n",[587,1788,1789],{"class":589,"line":717},[587,1790,646],{"emptyLinePlaceholder":645},[587,1792,1793,1796,1799,1802,1804,1807,1809,1812,1814,1816,1819],{"class":589,"line":725},[587,1794,1795],{"class":593},"export",[587,1797,1798],{"class":986}," function",[587,1800,1801],{"class":996}," createAcmeDrain",[587,1803,999],{"class":597},[587,1805,1806],{"class":1036},"overrides",[587,1808,1641],{"class":597},[587,1810,1811],{"class":1208}," Partial",[587,1813,1676],{"class":597},[587,1815,1679],{"class":1208},[587,1817,1818],{"class":597},">)",[587,1820,598],{"class":597},[587,1822,1823,1826,1829,1831,1833,1835,1837],{"class":589,"line":730},[587,1824,1825],{"class":593},"  return",[587,1827,1828],{"class":996}," defineHttpDrain",[587,1830,1676],{"class":597},[587,1832,1679],{"class":1208},[587,1834,1682],{"class":597},[587,1836,999],{"class":1007},[587,1838,1002],{"class":597},[587,1840,1841,1844,1846,1848,1851,1853],{"class":589,"line":736},[587,1842,1843],{"class":1007},"    name",[587,1845,1011],{"class":597},[587,1847,935],{"class":597},[587,1849,1850],{"class":938},"acme",[587,1852,1019],{"class":597},[587,1854,615],{"class":597},[587,1856,1857,1860,1862,1865,1868,1871],{"class":589,"line":744},[587,1858,1859],{"class":996},"    resolve",[587,1861,1011],{"class":597},[587,1863,1864],{"class":986}," async",[587,1866,1867],{"class":597}," ()",[587,1869,1870],{"class":986}," =>",[587,1872,598],{"class":597},[587,1874,1875,1878,1881,1883,1886,1889,1891,1893,1895,1897,1899,1901,1903,1905,1907,1909,1912],{"class":589,"line":752},[587,1876,1877],{"class":986},"      const",[587,1879,1880],{"class":611}," cfg",[587,1882,1111],{"class":597},[587,1884,1885],{"class":593}," await",[587,1887,1888],{"class":996}," resolveAdapterConfig",[587,1890,1676],{"class":597},[587,1892,1679],{"class":1208},[587,1894,1682],{"class":597},[587,1896,999],{"class":1007},[587,1898,1019],{"class":597},[587,1900,1850],{"class":938},[587,1902,1019],{"class":597},[587,1904,1196],{"class":597},[587,1906,1669],{"class":611},[587,1908,1196],{"class":597},[587,1910,1911],{"class":611}," overrides",[587,1913,1075],{"class":1007},[587,1915,1916,1919,1921,1923,1925,1927,1929,1931,1933,1935],{"class":589,"line":760},[587,1917,1918],{"class":593},"      return",[587,1920,1880],{"class":611},[587,1922,1050],{"class":597},[587,1924,1705],{"class":611},[587,1926,1137],{"class":597},[587,1928,1880],{"class":611},[587,1930,1205],{"class":593},[587,1932,1621],{"class":1208},[587,1934,1147],{"class":597},[587,1936,1937],{"class":597}," null\n",[587,1939,1940],{"class":589,"line":768},[587,1941,1942],{"class":597},"    },\n",[587,1944,1945,1948,1950,1952,1955,1957,1959,1961,1963,1965],{"class":589,"line":779},[587,1946,1947],{"class":996},"    encode",[587,1949,1011],{"class":597},[587,1951,1338],{"class":597},[587,1953,1954],{"class":1036},"events",[587,1956,1196],{"class":597},[587,1958,1880],{"class":1036},[587,1960,1434],{"class":597},[587,1962,1870],{"class":986},[587,1964,1338],{"class":1007},[587,1966,1002],{"class":597},[587,1968,1969,1972,1974,1977,1980,1982,1985,1988,1990,1993,1996,1999,2002],{"class":589,"line":784},[587,1970,1971],{"class":1007},"      url",[587,1973,1011],{"class":597},[587,1975,1976],{"class":597}," `${",[587,1978,1979],{"class":611},"cfg",[587,1981,1050],{"class":597},[587,1983,1984],{"class":611},"endpoint ",[587,1986,1987],{"class":597},"??",[587,1989,935],{"class":597},[587,1991,1992],{"class":938},"https:\u002F\u002Fapi.acme.com",[587,1994,1995],{"class":597},"'}",[587,1997,1998],{"class":938},"\u002Fv1\u002Fingest",[587,2000,2001],{"class":597},"`",[587,2003,615],{"class":597},[587,2005,2006,2009,2011,2013,2015,2018,2020,2022,2024,2027,2029,2031,2034,2036,2039,2042,2045,2047,2049,2051,2054],{"class":589,"line":790},[587,2007,2008],{"class":1007},"      headers",[587,2010,1011],{"class":597},[587,2012,963],{"class":597},[587,2014,935],{"class":597},[587,2016,2017],{"class":1007},"Content-Type",[587,2019,1019],{"class":597},[587,2021,1011],{"class":597},[587,2023,935],{"class":597},[587,2025,2026],{"class":938},"application\u002Fjson",[587,2028,1019],{"class":597},[587,2030,1196],{"class":597},[587,2032,2033],{"class":1007}," Authorization",[587,2035,1011],{"class":597},[587,2037,2038],{"class":597}," `",[587,2040,2041],{"class":938},"Bearer ",[587,2043,2044],{"class":597},"${",[587,2046,1979],{"class":611},[587,2048,1050],{"class":597},[587,2050,1705],{"class":611},[587,2052,2053],{"class":597},"}`",[587,2055,1781],{"class":597},[587,2057,2058,2061,2063,2066,2068,2071,2073,2075,2077],{"class":589,"line":798},[587,2059,2060],{"class":1007},"      body",[587,2062,1011],{"class":597},[587,2064,2065],{"class":611}," JSON",[587,2067,1050],{"class":597},[587,2069,2070],{"class":996},"stringify",[587,2072,999],{"class":1007},[587,2074,1954],{"class":611},[587,2076,1434],{"class":1007},[587,2078,615],{"class":597},[587,2080,2081,2084,2086],{"class":589,"line":806},[587,2082,2083],{"class":597},"    }",[587,2085,1434],{"class":1007},[587,2087,615],{"class":597},[587,2089,2090,2093],{"class":589,"line":814},[587,2091,2092],{"class":597},"  }",[587,2094,1075],{"class":1007},[587,2096,2097],{"class":589,"line":824},[587,2098,1658],{"class":597},[554,2100,2101,2103],{},[557,2102,1565],{}," handles batching, retries (default 2), timeouts (default 5000ms), and error isolation.",[573,2105,2107,2110],{"id":2106},"defineenricher-the-enricher-recipe",[557,2108,2109],{},"defineEnricher"," — the enricher recipe",[578,2112,2114],{"className":580,"code":2113,"language":582,"meta":583,"style":583},"import { defineEnricher, getHeader } from 'evlog\u002Ftoolkit'\n\nexport const tenantEnricher = defineEnricher\u003C{ id: string }>({\n  name: 'tenant',\n  field: 'tenant',\n  compute: ({ headers }) => {\n    const id = getHeader(headers, 'x-tenant-id')\n    return id ? { id } : undefined\n  },\n})\n",[557,2115,2116,2140,2144,2175,2190,2205,2224,2251,2271,2275],{"__ignoreMap":583},[587,2117,2118,2120,2122,2125,2127,2130,2132,2134,2136,2138],{"class":589,"line":590},[587,2119,594],{"class":593},[587,2121,963],{"class":597},[587,2123,2124],{"class":611}," defineEnricher",[587,2126,1196],{"class":597},[587,2128,2129],{"class":611}," getHeader",[587,2131,969],{"class":597},[587,2133,932],{"class":593},[587,2135,935],{"class":597},[587,2137,559],{"class":938},[587,2139,941],{"class":597},[587,2141,2142],{"class":589,"line":601},[587,2143,646],{"emptyLinePlaceholder":645},[587,2145,2146,2148,2151,2154,2156,2158,2161,2164,2166,2168,2171,2173],{"class":589,"line":608},[587,2147,1795],{"class":593},[587,2149,2150],{"class":986}," const",[587,2152,2153],{"class":611}," tenantEnricher ",[587,2155,993],{"class":597},[587,2157,2124],{"class":996},[587,2159,2160],{"class":597},"\u003C{",[587,2162,2163],{"class":1007}," id",[587,2165,1011],{"class":597},[587,2167,1230],{"class":1208},[587,2169,2170],{"class":597}," }>",[587,2172,999],{"class":611},[587,2174,1002],{"class":597},[587,2176,2177,2179,2181,2183,2186,2188],{"class":589,"line":618},[587,2178,1008],{"class":1007},[587,2180,1011],{"class":597},[587,2182,935],{"class":597},[587,2184,2185],{"class":938},"tenant",[587,2187,1019],{"class":597},[587,2189,615],{"class":597},[587,2191,2192,2195,2197,2199,2201,2203],{"class":589,"line":626},[587,2193,2194],{"class":1007},"  field",[587,2196,1011],{"class":597},[587,2198,935],{"class":597},[587,2200,2185],{"class":938},[587,2202,1019],{"class":597},[587,2204,615],{"class":597},[587,2206,2207,2210,2212,2215,2218,2220,2222],{"class":589,"line":634},[587,2208,2209],{"class":996},"  compute",[587,2211,1011],{"class":597},[587,2213,2214],{"class":597}," ({",[587,2216,2217],{"class":1036}," headers",[587,2219,1040],{"class":597},[587,2221,1870],{"class":986},[587,2223,598],{"class":597},[587,2225,2226,2229,2231,2233,2235,2237,2240,2242,2244,2247,2249],{"class":589,"line":642},[587,2227,2228],{"class":986},"    const",[587,2230,2163],{"class":611},[587,2232,1111],{"class":597},[587,2234,2129],{"class":996},[587,2236,999],{"class":1007},[587,2238,2239],{"class":611},"headers",[587,2241,1196],{"class":597},[587,2243,935],{"class":597},[587,2245,2246],{"class":938},"x-tenant-id",[587,2248,1019],{"class":597},[587,2250,1075],{"class":1007},[587,2252,2253,2256,2258,2260,2262,2264,2266,2268],{"class":589,"line":649},[587,2254,2255],{"class":593},"    return",[587,2257,2163],{"class":611},[587,2259,1137],{"class":597},[587,2261,963],{"class":597},[587,2263,2163],{"class":611},[587,2265,969],{"class":597},[587,2267,1147],{"class":597},[587,2269,2270],{"class":597}," undefined\n",[587,2272,2273],{"class":589,"line":655},[587,2274,1080],{"class":597},[587,2276,2277,2279],{"class":589,"line":663},[587,2278,929],{"class":597},[587,2280,1075],{"class":611},[573,2282,2284,2287],{"id":2283},"defineevlog-canonical-config",[557,2285,2286],{},"defineEvlog"," — canonical config",[554,2289,2290,2291,2294],{},"A single config object that works everywhere — ",[557,2292,2293],{},"initLogger",", framework middlewares, the Nuxt module, Workers.",[578,2296,2298],{"className":580,"code":2297,"language":582,"meta":583,"style":583},"import { defineEvlog, toLoggerConfig, toMiddlewareOptions } from 'evlog\u002Ftoolkit'\n\nexport const evlogConfig = defineEvlog({\n  service: 'shop',\n  environment: process.env.NODE_ENV,\n  drain: createAxiomDrain(),\n  enrich: createDefaultEnrichers(),\n  plugins: [requestMetricsPlugin],\n})\n\n\u002F\u002F Standalone\ninitLogger(toLoggerConfig(evlogConfig))\n\n\u002F\u002F Framework\napp.use(evlog(toMiddlewareOptions(evlogConfig)))\n",[557,2299,2300,2329,2333,2350,2366,2388,2401,2414,2426,2432,2436,2441,2453,2457,2462],{"__ignoreMap":583},[587,2301,2302,2304,2306,2309,2311,2314,2316,2319,2321,2323,2325,2327],{"class":589,"line":590},[587,2303,594],{"class":593},[587,2305,963],{"class":597},[587,2307,2308],{"class":611}," defineEvlog",[587,2310,1196],{"class":597},[587,2312,2313],{"class":611}," toLoggerConfig",[587,2315,1196],{"class":597},[587,2317,2318],{"class":611}," toMiddlewareOptions",[587,2320,969],{"class":597},[587,2322,932],{"class":593},[587,2324,935],{"class":597},[587,2326,559],{"class":938},[587,2328,941],{"class":597},[587,2330,2331],{"class":589,"line":601},[587,2332,646],{"emptyLinePlaceholder":645},[587,2334,2335,2337,2339,2342,2344,2346,2348],{"class":589,"line":608},[587,2336,1795],{"class":593},[587,2338,2150],{"class":986},[587,2340,2341],{"class":611}," evlogConfig ",[587,2343,993],{"class":597},[587,2345,2308],{"class":996},[587,2347,999],{"class":611},[587,2349,1002],{"class":597},[587,2351,2352,2355,2357,2359,2362,2364],{"class":589,"line":618},[587,2353,2354],{"class":1007},"  service",[587,2356,1011],{"class":597},[587,2358,935],{"class":597},[587,2360,2361],{"class":938},"shop",[587,2363,1019],{"class":597},[587,2365,615],{"class":597},[587,2367,2368,2371,2373,2376,2378,2381,2383,2386],{"class":589,"line":626},[587,2369,2370],{"class":1007},"  environment",[587,2372,1011],{"class":597},[587,2374,2375],{"class":611}," process",[587,2377,1050],{"class":597},[587,2379,2380],{"class":611},"env",[587,2382,1050],{"class":597},[587,2384,2385],{"class":611},"NODE_ENV",[587,2387,615],{"class":597},[587,2389,2390,2392,2394,2396,2399],{"class":589,"line":634},[587,2391,1167],{"class":1007},[587,2393,1011],{"class":597},[587,2395,1529],{"class":996},[587,2397,2398],{"class":611},"()",[587,2400,615],{"class":597},[587,2402,2403,2405,2407,2410,2412],{"class":589,"line":642},[587,2404,1089],{"class":1007},[587,2406,1011],{"class":597},[587,2408,2409],{"class":996}," createDefaultEnrichers",[587,2411,2398],{"class":611},[587,2413,615],{"class":597},[587,2415,2416,2419,2421,2424],{"class":589,"line":649},[587,2417,2418],{"class":1007},"  plugins",[587,2420,1011],{"class":597},[587,2422,2423],{"class":611}," [requestMetricsPlugin]",[587,2425,615],{"class":597},[587,2427,2428,2430],{"class":589,"line":655},[587,2429,929],{"class":597},[587,2431,1075],{"class":611},[587,2433,2434],{"class":589,"line":663},[587,2435,646],{"emptyLinePlaceholder":645},[587,2437,2438],{"class":589,"line":671},[587,2439,2440],{"class":604},"\u002F\u002F Standalone\n",[587,2442,2443,2445,2447,2450],{"class":589,"line":679},[587,2444,2293],{"class":996},[587,2446,999],{"class":611},[587,2448,2449],{"class":996},"toLoggerConfig",[587,2451,2452],{"class":611},"(evlogConfig))\n",[587,2454,2455],{"class":589,"line":684},[587,2456,646],{"emptyLinePlaceholder":645},[587,2458,2459],{"class":589,"line":690},[587,2460,2461],{"class":604},"\u002F\u002F Framework\n",[587,2463,2464,2467,2469,2472,2474,2477,2479,2482],{"class":589,"line":698},[587,2465,2466],{"class":611},"app",[587,2468,1050],{"class":597},[587,2470,2471],{"class":996},"use",[587,2473,999],{"class":611},[587,2475,2476],{"class":996},"evlog",[587,2478,999],{"class":611},[587,2480,2481],{"class":996},"toMiddlewareOptions",[587,2483,2484],{"class":611},"(evlogConfig)))\n",[573,2486,2488,2491],{"id":2487},"defineframeworkintegration-the-framework-recipe",[557,2489,2490],{},"defineFrameworkIntegration"," — the framework recipe",[554,2493,2494,2495,2498,2499,2502],{},"For any framework with a ",[557,2496,2497],{},"(ctx, next)"," middleware shape (Hono, Express, Elysia, Fastify, …) — see ",[2500,2501,285],"a",{"href":286}," for the full guide.",[573,2504,2506],{"id":2505},"composition","Composition",[578,2508,2510],{"className":580,"code":2509,"language":582,"meta":583,"style":583},"import { composeDrains, composeEnrichers, composeKeep } from 'evlog\u002Ftoolkit'\n\nconst drain = composeDrains([createAxiomDrain(), createSentryDrain()])\nconst enrich = composeEnrichers([createUserAgentEnricher(), createGeoEnricher()])\nconst keep = composeKeep([\n  ({ duration, shouldKeep }) => duration && duration > 2000 ? true : shouldKeep,\n  ({ event }) => event.level === 'error',\n])\n",[557,2511,2512,2541,2545,2572,2597,2611,2653,2681],{"__ignoreMap":583},[587,2513,2514,2516,2518,2521,2523,2526,2528,2531,2533,2535,2537,2539],{"class":589,"line":590},[587,2515,594],{"class":593},[587,2517,963],{"class":597},[587,2519,2520],{"class":611}," composeDrains",[587,2522,1196],{"class":597},[587,2524,2525],{"class":611}," composeEnrichers",[587,2527,1196],{"class":597},[587,2529,2530],{"class":611}," composeKeep",[587,2532,969],{"class":597},[587,2534,932],{"class":593},[587,2536,935],{"class":597},[587,2538,559],{"class":938},[587,2540,941],{"class":597},[587,2542,2543],{"class":589,"line":601},[587,2544,646],{"emptyLinePlaceholder":645},[587,2546,2547,2549,2552,2554,2556,2559,2562,2564,2566,2569],{"class":589,"line":608},[587,2548,987],{"class":986},[587,2550,2551],{"class":611}," drain ",[587,2553,993],{"class":597},[587,2555,2520],{"class":996},[587,2557,2558],{"class":611},"([",[587,2560,2561],{"class":996},"createAxiomDrain",[587,2563,2398],{"class":611},[587,2565,1196],{"class":597},[587,2567,2568],{"class":996}," createSentryDrain",[587,2570,2571],{"class":611},"()])\n",[587,2573,2574,2576,2579,2581,2583,2585,2588,2590,2592,2595],{"class":589,"line":618},[587,2575,987],{"class":986},[587,2577,2578],{"class":611}," enrich ",[587,2580,993],{"class":597},[587,2582,2525],{"class":996},[587,2584,2558],{"class":611},[587,2586,2587],{"class":996},"createUserAgentEnricher",[587,2589,2398],{"class":611},[587,2591,1196],{"class":597},[587,2593,2594],{"class":996}," createGeoEnricher",[587,2596,2571],{"class":611},[587,2598,2599,2601,2604,2606,2608],{"class":589,"line":626},[587,2600,987],{"class":986},[587,2602,2603],{"class":611}," keep ",[587,2605,993],{"class":597},[587,2607,2530],{"class":996},[587,2609,2610],{"class":611},"([\n",[587,2612,2613,2616,2619,2621,2624,2626,2628,2631,2634,2636,2638,2641,2643,2647,2649,2651],{"class":589,"line":634},[587,2614,2615],{"class":597},"  ({",[587,2617,2618],{"class":1036}," duration",[587,2620,1196],{"class":597},[587,2622,2623],{"class":1036}," shouldKeep",[587,2625,1040],{"class":597},[587,2627,1870],{"class":986},[587,2629,2630],{"class":611}," duration ",[587,2632,2633],{"class":597},"&&",[587,2635,2630],{"class":611},[587,2637,1682],{"class":597},[587,2639,2640],{"class":1133}," 2000",[587,2642,1137],{"class":597},[587,2644,2646],{"class":2645},"sfNiH"," true",[587,2648,1147],{"class":597},[587,2650,2623],{"class":611},[587,2652,615],{"class":597},[587,2654,2655,2657,2659,2661,2663,2665,2667,2670,2673,2675,2677,2679],{"class":589,"line":642},[587,2656,2615],{"class":597},[587,2658,1094],{"class":1036},[587,2660,1040],{"class":597},[587,2662,1870],{"class":986},[587,2664,1094],{"class":611},[587,2666,1050],{"class":597},[587,2668,2669],{"class":611},"level ",[587,2671,2672],{"class":597},"===",[587,2674,935],{"class":597},[587,2676,1360],{"class":938},[587,2678,1019],{"class":597},[587,2680,615],{"class":597},[587,2682,2683],{"class":589,"line":649},[587,2684,2685],{"class":611},"])\n",[554,2687,2688,2689,2692],{},"All composers isolate errors in individual functions and run drains concurrently with ",[557,2690,2691],{},"Promise.allSettled"," semantics.",[573,2694,2696],{"id":2695},"helpers","Helpers",[2698,2699,2700,2713],"table",{},[2701,2702,2703],"thead",{},[2704,2705,2706,2710],"tr",{},[2707,2708,2709],"th",{},"Export",[2707,2711,2712],{},"Purpose",[2714,2715,2716,2727,2750,2760,2774,2787,2800,2813,2823,2837],"tbody",{},[2704,2717,2718,2724],{},[2719,2720,2721],"td",{},[557,2722,2723],{},"httpPost(opts)",[2719,2725,2726],{},"POST helper used by every built-in HTTP adapter — handles timeout, retries, redacted error messages",[2704,2728,2729,2734],{},[2719,2730,2731],{},[557,2732,2733],{},"resolveAdapterConfig(ns, fields, overrides)",[2719,2735,2736,2737,2740,2741,2740,2744,2740,2747],{},"Standard config priority: overrides → ",[557,2738,2739],{},"runtimeConfig.evlog.\u003Cns>"," → ",[557,2742,2743],{},"runtimeConfig.\u003Cns>",[557,2745,2746],{},"NUXT_\u003CNS>_*",[557,2748,2749],{},"\u003CNS>_*",[2704,2751,2752,2757],{},[2719,2753,2754],{},[557,2755,2756],{},"getHeader(headers, name)",[2719,2758,2759],{},"Case-insensitive HTTP header lookup",[2704,2761,2762,2767],{},[2719,2763,2764],{},[557,2765,2766],{},"normalizeNumber(value)",[2719,2768,2769,2770,2773],{},"Parse a string to number, return ",[557,2771,2772],{},"undefined"," if non-finite",[2704,2775,2776,2781],{},[2719,2777,2778],{},[557,2779,2780],{},"extractSafeHeaders(headers)",[2719,2782,2783,2784],{},"Filter sensitive headers from a Web ",[557,2785,2786],{},"Headers",[2704,2788,2789,2794],{},[2719,2790,2791],{},[557,2792,2793],{},"extractSafeNodeHeaders(headers)",[2719,2795,2796,2797],{},"Filter sensitive headers from Node ",[557,2798,2799],{},"IncomingHttpHeaders",[2704,2801,2802,2807],{},[2719,2803,2804],{},[557,2805,2806],{},"mergeEventField(existing, computed, overwrite?)",[2719,2808,2809,2810],{},"Merge a sub-object into an event field, respecting ",[557,2811,2812],{},"overwrite",[2704,2814,2815,2820],{},[2719,2816,2817],{},[557,2818,2819],{},"toTypedAttributeValue(value)",[2719,2821,2822],{},"Convert any value to the typed attribute shape used by Axiom \u002F Sentry",[2704,2824,2825,2830],{},[2719,2826,2827],{},[557,2828,2829],{},"toOtlpAttributeValue(value)",[2719,2831,2832,2833,2836],{},"Convert any value to the OTLP ",[557,2834,2835],{},"AnyValue"," shape (used by OTLP \u002F HyperDX \u002F PostHog logs)",[2704,2838,2839,2848],{},[2719,2840,2841,2844,2845],{},[557,2842,2843],{},"OTEL_SEVERITY_NUMBER",", ",[557,2846,2847],{},"OTEL_SEVERITY_TEXT",[2719,2849,2850],{},"OTEL log severity tables",[573,2852,2854],{"id":2853},"building-a-community-package","Building a community package",[554,2856,2857],{},"The recommended structure for a community package on top of evlog:",[578,2859,2864],{"className":2860,"code":2862,"language":2863},[2861],"language-text","my-evlog-pkg\u002F\n├─ src\u002F\n│  ├─ drain.ts        # createMyDrain via defineHttpDrain\n│  ├─ enricher.ts     # createMyEnricher via defineEnricher\n│  └─ index.ts        # re-exports\n├─ test\u002F              # vitest, mock fetch\n├─ package.json       # peerDependency: \"evlog\"\n└─ README.md\n","text",[557,2865,2862],{"__ignoreMap":583},[554,2867,2868,2869,2871,2872,2875],{},"Add ",[557,2870,2476],{}," as a ",[557,2873,2874],{},"peerDependency"," (not a dependency) — your package shouldn't pull in a copy of evlog at install time.",[562,2877,2880,2881,2887],{"color":2878,"icon":2879},"neutral","i-lucide-heart","Built something great? ",[2500,2882,2886],{"href":2883,"rel":2884},"https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog\u002Fpulls",[2885],"nofollow","Open a PR"," to add a row to the Adapters \u002F Enrichers tables — the community will thank you.",[573,2889,2891],{"id":2890},"see-also","See Also",[2893,2894,2895,2904,2911,2917,2922],"ul",{},[2896,2897,2898,2900,2901,2903],"li",{},[2500,2899,523],{"href":524}," — the ",[557,2902,1565],{}," recipe in detail",[2896,2905,2906,2900,2909,2903],{},[2500,2907,2908],{"href":545},"Custom Enrichers",[557,2910,2109],{},[2896,2912,2913,2900,2915,2903],{},[2500,2914,285],{"href":286},[557,2916,2490],{},[2896,2918,2919,2921],{},[2500,2920,326],{"href":515}," — batching and retry primitives for high-throughput drains",[2896,2923,2924,2927],{},[2500,2925,2926],{"href":519},"HTTP drain"," — browser→server log transport",[2929,2930,2931],"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 .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .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 .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 .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 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 .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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":583,"searchDepth":601,"depth":601,"links":2933},[2934,2935,2938,2940,2942,2944,2946,2947,2948,2949],{"id":575,"depth":601,"text":576},{"id":944,"depth":601,"text":945,"children":2936},[2937],{"id":1470,"depth":608,"text":1471},{"id":1562,"depth":601,"text":2939},"defineHttpDrain — the adapter recipe",{"id":2106,"depth":601,"text":2941},"defineEnricher — the enricher recipe",{"id":2283,"depth":601,"text":2943},"defineEvlog — canonical config",{"id":2487,"depth":601,"text":2945},"defineFrameworkIntegration — the framework recipe",{"id":2505,"depth":601,"text":2506},{"id":2695,"depth":601,"text":2696},{"id":2853,"depth":601,"text":2854},{"id":2890,"depth":601,"text":2891},"The evlog\u002Ftoolkit public API — every primitive used to build adapters, enrichers, plugins, and framework integrations.","md",[2953,2955],{"label":523,"icon":83,"to":524,"color":2878,"variant":2954},"subtle",{"label":285,"icon":288,"to":286,"color":2878,"variant":2954},{},{"title":527,"icon":530},{"title":549,"description":2950},"gAoEh3mMuCFYojVzta-qdi-w-2ms-dsmyK--lB4350E",[2961,2963],{"title":523,"path":524,"stem":525,"description":2962,"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.",{"title":41,"path":537,"stem":538,"description":2964,"icon":28,"children":-1},"Enrich your wide events with derived context like user agent, geo data, request size, and trace context. Built-in enrichers and custom enricher support.",1778338245457]