[{"data":1,"prerenderedAt":2845},["ShallowReactive",2],{"navigation_docs":3,"-adapters-building-blocks-toolkit":427,"-adapters-building-blocks-toolkit-surround":2840},[4,35,159,201,289,324,411],{"title":5,"path":6,"stem":7,"children":8,"page":34},"Getting Started","\u002Fgetting-started","1.getting-started",[9,14,19,24,29],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick Start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start","i-lucide-zap",{"title":25,"path":26,"stem":27,"icon":28},"Agent Skills","\u002Fgetting-started\u002Fagent-skills","1.getting-started\u002F4.agent-skills","i-lucide-sparkles",{"title":30,"path":31,"stem":32,"icon":33},"vs Other Loggers","\u002Fgetting-started\u002Fvs-other-loggers","1.getting-started\u002F5.vs-other-loggers","i-lucide-scale",false,{"title":36,"path":37,"stem":38,"children":39,"page":34},"Logging","\u002Flogging","2.logging",[40,45,50,55,60,65,70,99,127],{"title":41,"path":42,"stem":43,"icon":44},"Overview","\u002Flogging\u002Foverview","2.logging\u002F0.overview","i-lucide-list",{"title":46,"path":47,"stem":48,"icon":49},"Simple Logging","\u002Flogging\u002Fsimple-logging","2.logging\u002F1.simple-logging","i-lucide-terminal",{"title":51,"path":52,"stem":53,"icon":54},"Wide Events","\u002Flogging\u002Fwide-events","2.logging\u002F2.wide-events","i-lucide-layers",{"title":56,"path":57,"stem":58,"icon":59},"Structured Errors","\u002Flogging\u002Fstructured-errors","2.logging\u002F3.structured-errors","i-lucide-shield-alert",{"title":61,"path":62,"stem":63,"icon":64},"Catalogs","\u002Flogging\u002Fcatalogs","2.logging\u002F4.catalogs","i-lucide-book-open",{"title":66,"path":67,"stem":68,"icon":69},"Client Logging","\u002Flogging\u002Fclient-logging","2.logging\u002F5.client-logging","i-lucide-monitor",{"title":71,"icon":72,"path":73,"stem":74,"children":75,"page":34},"AI SDK","i-simple-icons-vercel","\u002Flogging\u002Fai-sdk","2.logging\u002F6.ai-sdk",[76,79,84,89,94],{"title":41,"path":77,"stem":78,"icon":44},"\u002Flogging\u002Fai-sdk\u002Foverview","2.logging\u002F6.ai-sdk\u002F01.overview",{"title":80,"path":81,"stem":82,"icon":83},"Usage","\u002Flogging\u002Fai-sdk\u002Fusage","2.logging\u002F6.ai-sdk\u002F02.usage","i-lucide-code",{"title":85,"path":86,"stem":87,"icon":88},"Options","\u002Flogging\u002Fai-sdk\u002Foptions","2.logging\u002F6.ai-sdk\u002F03.options","i-lucide-sliders",{"title":90,"path":91,"stem":92,"icon":93},"Metadata","\u002Flogging\u002Fai-sdk\u002Fmetadata","2.logging\u002F6.ai-sdk\u002F04.metadata","i-lucide-database",{"title":95,"path":96,"stem":97,"icon":98},"Telemetry","\u002Flogging\u002Fai-sdk\u002Ftelemetry","2.logging\u002F6.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":100,"icon":101,"path":102,"stem":103,"children":104,"page":34},"Better Auth","i-simple-icons-betterauth","\u002Flogging\u002Fbetter-auth","2.logging\u002F7.better-auth",[105,108,113,118,122],{"title":41,"path":106,"stem":107,"icon":44},"\u002Flogging\u002Fbetter-auth\u002Foverview","2.logging\u002F7.better-auth\u002F01.overview",{"title":109,"path":110,"stem":111,"icon":112},"Identify User","\u002Flogging\u002Fbetter-auth\u002Fidentify-user","2.logging\u002F7.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":114,"path":115,"stem":116,"icon":117},"Middleware","\u002Flogging\u002Fbetter-auth\u002Fmiddleware","2.logging\u002F7.better-auth\u002F03.middleware","i-lucide-shield",{"title":119,"path":120,"stem":121,"icon":69},"Client Sync","\u002Flogging\u002Fbetter-auth\u002Fclient-sync","2.logging\u002F7.better-auth\u002F04.client-sync",{"title":123,"path":124,"stem":125,"icon":126},"Performance","\u002Flogging\u002Fbetter-auth\u002Fperformance","2.logging\u002F7.better-auth\u002F05.performance","i-lucide-gauge",{"title":128,"icon":129,"path":130,"stem":131,"children":132,"page":34},"Audit Logs","i-lucide-shield-check","\u002Flogging\u002Faudit","2.logging\u002F8.audit",[133,136,141,146,151,155],{"title":41,"path":134,"stem":135,"icon":44},"\u002Flogging\u002Faudit\u002Foverview","2.logging\u002F8.audit\u002F01.overview",{"title":137,"path":138,"stem":139,"icon":140},"Schema","\u002Flogging\u002Faudit\u002Fschema","2.logging\u002F8.audit\u002F02.schema","i-lucide-file-text",{"title":142,"path":143,"stem":144,"icon":145},"Recording","\u002Flogging\u002Faudit\u002Frecording","2.logging\u002F8.audit\u002F03.recording","i-lucide-pen-line",{"title":147,"path":148,"stem":149,"icon":150},"Drains","\u002Flogging\u002Faudit\u002Fpipeline","2.logging\u002F8.audit\u002F04.pipeline","i-lucide-link",{"title":152,"path":153,"stem":154,"icon":129},"Compliance","\u002Flogging\u002Faudit\u002Fcompliance","2.logging\u002F8.audit\u002F05.compliance",{"title":156,"path":157,"stem":158,"icon":64},"Recipes","\u002Flogging\u002Faudit\u002Frecipes","2.logging\u002F8.audit\u002F06.recipes",{"title":160,"path":161,"stem":162,"children":163,"page":34},"Core Concepts","\u002Fcore-concepts","3.core-concepts",[164,169,174,179,184,188,191,196],{"title":165,"path":166,"stem":167,"icon":168},"Lifecycle","\u002Fcore-concepts\u002Flifecycle","3.core-concepts\u002F0.lifecycle","i-lucide-arrow-right-left",{"title":170,"path":171,"stem":172,"icon":173},"Configuration","\u002Fcore-concepts\u002Fconfiguration","3.core-concepts\u002F1.configuration","i-lucide-settings",{"title":175,"path":176,"stem":177,"icon":178},"Sampling","\u002Fcore-concepts\u002Fsampling","3.core-concepts\u002F2.sampling","i-lucide-filter",{"title":180,"path":181,"stem":182,"icon":183},"Typed Fields","\u002Fcore-concepts\u002Ftyped-fields","3.core-concepts\u002F3.typed-fields","i-simple-icons-typescript",{"title":185,"path":186,"stem":187,"icon":129},"Best Practices","\u002Fcore-concepts\u002Fbest-practices","3.core-concepts\u002F4.best-practices",{"title":123,"path":189,"stem":190,"icon":126},"\u002Fcore-concepts\u002Fperformance","3.core-concepts\u002F5.performance",{"title":192,"path":193,"stem":194,"icon":195},"Vite Plugin","\u002Fcore-concepts\u002Fvite-plugin","3.core-concepts\u002F6.vite-plugin","i-custom-vite",{"title":197,"path":198,"stem":199,"icon":200},"Auto-Redaction","\u002Fcore-concepts\u002Fredaction","3.core-concepts\u002F7.redaction","i-lucide-eye-off",{"title":202,"path":203,"stem":204,"children":205,"page":34},"Frameworks","\u002Fframeworks","4.frameworks",[206,210,215,220,225,230,235,240,245,250,255,260,265,270,274,279,284],{"title":41,"path":207,"stem":208,"icon":209},"\u002Fframeworks\u002Foverview","4.frameworks\u002F00.overview","i-lucide-layout-grid",{"title":211,"path":212,"stem":213,"icon":214},"Nuxt","\u002Fframeworks\u002Fnuxt","4.frameworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":216,"path":217,"stem":218,"icon":219},"Next.js","\u002Fframeworks\u002Fnextjs","4.frameworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":221,"path":222,"stem":223,"icon":224},"SvelteKit","\u002Fframeworks\u002Fsveltekit","4.frameworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":226,"path":227,"stem":228,"icon":229},"Nitro","\u002Fframeworks\u002Fnitro","4.frameworks\u002F04.nitro","i-custom-nitro",{"title":231,"path":232,"stem":233,"icon":234},"TanStack Start","\u002Fframeworks\u002Ftanstack-start","4.frameworks\u002F05.tanstack-start","i-custom-tanstack",{"title":236,"path":237,"stem":238,"icon":239},"NestJS","\u002Fframeworks\u002Fnestjs","4.frameworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":241,"path":242,"stem":243,"icon":244},"Express","\u002Fframeworks\u002Fexpress","4.frameworks\u002F07.express","i-simple-icons-express",{"title":246,"path":247,"stem":248,"icon":249},"Hono","\u002Fframeworks\u002Fhono","4.frameworks\u002F08.hono","i-simple-icons-hono",{"title":251,"path":252,"stem":253,"icon":254},"Fastify","\u002Fframeworks\u002Ffastify","4.frameworks\u002F09.fastify","i-simple-icons-fastify",{"title":256,"path":257,"stem":258,"icon":259},"Elysia","\u002Fframeworks\u002Felysia","4.frameworks\u002F10.elysia","i-custom-elysia",{"title":261,"path":262,"stem":263,"icon":264},"React Router","\u002Fframeworks\u002Freact-router","4.frameworks\u002F11.react-router","i-custom-reactrouter",{"title":266,"path":267,"stem":268,"icon":269},"Cloudflare Workers","\u002Fframeworks\u002Fcloudflare-workers","4.frameworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":271,"path":272,"stem":273,"icon":183},"Standalone","\u002Fframeworks\u002Fstandalone","4.frameworks\u002F13.standalone",{"title":275,"path":276,"stem":277,"icon":278},"Astro","\u002Fframeworks\u002Fastro","4.frameworks\u002F14.astro","i-simple-icons-astro",{"title":280,"path":281,"stem":282,"icon":283},"AWS Lambda","\u002Fframeworks\u002Faws-lambda","4.frameworks\u002F16.aws-lambda","i-custom-lambda",{"title":285,"path":286,"stem":287,"icon":288},"Custom Integration","\u002Fframeworks\u002Fcustom-integration","4.frameworks\u002F17.custom-integration","i-lucide-puzzle",{"title":290,"path":291,"stem":292,"children":293,"page":34},"Build on top","\u002Fbuild-on-top","5.build-on-top",[294,297,302,307,311,315,320],{"title":41,"path":295,"stem":296,"icon":54},"\u002Fbuild-on-top\u002Foverview","5.build-on-top\u002F0.overview",{"title":298,"path":299,"stem":300,"icon":301},"Stream","\u002Fbuild-on-top\u002Fstream","5.build-on-top\u002F1.stream","i-lucide-radio-tower",{"title":303,"path":304,"stem":305,"icon":306},"FS reader","\u002Fbuild-on-top\u002Ffs-reader","5.build-on-top\u002F2.fs-reader","i-lucide-folder-search",{"title":156,"path":308,"stem":309,"icon":310},"\u002Fbuild-on-top\u002Fconsumer-recipes","5.build-on-top\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":312,"path":313,"stem":314,"icon":288},"Pipeline extension","\u002Fbuild-on-top\u002Fpipeline-extension","5.build-on-top\u002F4.pipeline-extension",{"title":316,"path":317,"stem":318,"icon":319},"Sinks","\u002Fbuild-on-top\u002Fsinks","5.build-on-top\u002F5.sinks","i-lucide-share-2",{"title":321,"path":322,"stem":323,"icon":288},"Framework integration","\u002Fbuild-on-top\u002Fframework-integration","5.build-on-top\u002F6.framework-integration",{"title":325,"path":326,"stem":327,"children":328,"page":34},"Adapters","\u002Fadapters","6.adapters",[329,332,372,387],{"title":41,"path":330,"stem":331,"icon":44},"\u002Fadapters\u002Foverview","6.adapters\u002F01.overview",{"title":333,"path":334,"stem":335,"children":336,"page":34},"Cloud destinations","\u002Fadapters\u002Fcloud","6.adapters\u002F02.cloud",[337,342,347,352,357,362,367],{"title":338,"path":339,"stem":340,"icon":341},"Axiom","\u002Fadapters\u002Fcloud\u002Faxiom","6.adapters\u002F02.cloud\u002F01.axiom","i-custom-axiom",{"title":343,"path":344,"stem":345,"icon":346},"OTLP","\u002Fadapters\u002Fcloud\u002Fotlp","6.adapters\u002F02.cloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":348,"path":349,"stem":350,"icon":351},"PostHog","\u002Fadapters\u002Fcloud\u002Fposthog","6.adapters\u002F02.cloud\u002F03.posthog","i-simple-icons-posthog",{"title":353,"path":354,"stem":355,"icon":356},"Sentry","\u002Fadapters\u002Fcloud\u002Fsentry","6.adapters\u002F02.cloud\u002F04.sentry","i-simple-icons-sentry",{"title":358,"path":359,"stem":360,"icon":361},"Better Stack","\u002Fadapters\u002Fcloud\u002Fbetter-stack","6.adapters\u002F02.cloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":363,"path":364,"stem":365,"icon":366},"Datadog","\u002Fadapters\u002Fcloud\u002Fdatadog","6.adapters\u002F02.cloud\u002F06.datadog","i-simple-icons-datadog",{"title":368,"path":369,"stem":370,"icon":371},"HyperDX","\u002Fadapters\u002Fcloud\u002Fhyperdx","6.adapters\u002F02.cloud\u002F07.hyperdx","i-custom-hyperdx",{"title":373,"path":374,"stem":375,"children":376,"page":34},"Self-hosted","\u002Fadapters\u002Fself-hosted","6.adapters\u002F03.self-hosted",[377,382],{"title":378,"path":379,"stem":380,"icon":381},"File System","\u002Fadapters\u002Fself-hosted\u002Ffs","6.adapters\u002F03.self-hosted\u002F01.fs","i-lucide-hard-drive",{"title":383,"path":384,"stem":385,"icon":386},"NuxtHub","\u002Fadapters\u002Fself-hosted\u002Fnuxthub","6.adapters\u002F03.self-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":388,"path":389,"stem":390,"children":391,"page":34},"Building blocks","\u002Fadapters\u002Fbuilding-blocks","6.adapters\u002F04.building-blocks",[392,397,402,406],{"title":393,"path":394,"stem":395,"icon":396},"Pipeline","\u002Fadapters\u002Fbuilding-blocks\u002Fpipeline","6.adapters\u002F04.building-blocks\u002F01.pipeline","i-lucide-workflow",{"title":398,"path":399,"stem":400,"icon":401},"HTTP","\u002Fadapters\u002Fbuilding-blocks\u002Fhttp","6.adapters\u002F04.building-blocks\u002F02.http","i-lucide-globe",{"title":403,"path":404,"stem":405,"icon":83},"Custom Adapters","\u002Fadapters\u002Fbuilding-blocks\u002Fcustom","6.adapters\u002F04.building-blocks\u002F03.custom",{"title":407,"path":408,"stem":409,"icon":410},"Toolkit","\u002Fadapters\u002Fbuilding-blocks\u002Ftoolkit","6.adapters\u002F04.building-blocks\u002F04.toolkit","i-lucide-blocks",{"title":412,"path":413,"stem":414,"children":415,"page":34},"Enrichers","\u002Fenrichers","7.enrichers",[416,419,423],{"title":41,"path":417,"stem":418,"icon":28},"\u002Fenrichers\u002Foverview","7.enrichers\u002F1.overview",{"title":420,"path":421,"stem":422,"icon":288},"Built-in","\u002Fenrichers\u002Fbuilt-in","7.enrichers\u002F2.built-in",{"title":424,"path":425,"stem":426,"icon":83},"Custom","\u002Fenrichers\u002Fcustom","7.enrichers\u002F3.custom",{"id":428,"title":429,"body":430,"description":2830,"extension":2831,"links":2832,"meta":2836,"navigation":2837,"path":408,"seo":2838,"stem":409,"__hash__":2839},"docs\u002F6.adapters\u002F04.building-blocks\u002F04.toolkit.md","Toolkit Reference",{"type":431,"value":432,"toc":2812},"minimark",[433,441,452,457,822,826,832,1332,1347,1352,1440,1447,1979,1984,1991,2161,2168,2175,2365,2372,2383,2387,2566,2573,2577,2731,2735,2738,2746,2756,2768,2772,2808],[434,435,436,440],"p",{},[437,438,439],"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.",[442,443,446,447,451],"callout",{"color":444,"icon":445},"warning","i-lucide-flask-conical","The toolkit is marked as ",[448,449,450],"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.",[453,454,456],"h2",{"id":455},"quick-reference","Quick Reference",[458,459,464],"pre",{"className":460,"code":461,"language":462,"meta":463,"style":463},"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","",[437,465,466,479,486,496,504,512,520,527,533,541,549,557,562,568,576,584,589,595,603,608,614,622,630,638,646,657,662,668,676,684,692,702,707,713,721,726,732,740,748,756,764,772,780,788,796,804],{"__ignoreMap":463},[467,468,471,475],"span",{"class":469,"line":470},"line",1,[467,472,474],{"class":473},"s7zQu","import",[467,476,478],{"class":477},"sMK4o"," {\n",[467,480,482],{"class":469,"line":481},2,[467,483,485],{"class":484},"sHwdD","  \u002F\u002F Plugins — the unified extension contract\n",[467,487,489,493],{"class":469,"line":488},3,[467,490,492],{"class":491},"sTEyZ","  definePlugin",[467,494,495],{"class":477},",\n",[467,497,499,502],{"class":469,"line":498},4,[467,500,501],{"class":491},"  drainPlugin",[467,503,495],{"class":477},[467,505,507,510],{"class":469,"line":506},5,[467,508,509],{"class":491},"  enricherPlugin",[467,511,495],{"class":477},[467,513,515,518],{"class":469,"line":514},6,[467,516,517],{"class":491},"  composePlugins",[467,519,495],{"class":477},[467,521,523],{"class":469,"line":522},7,[467,524,526],{"emptyLinePlaceholder":525},true,"\n",[467,528,530],{"class":469,"line":529},8,[467,531,532],{"class":484},"  \u002F\u002F Drains\n",[467,534,536,539],{"class":469,"line":535},9,[467,537,538],{"class":491},"  defineDrain",[467,540,495],{"class":477},[467,542,544,547],{"class":469,"line":543},10,[467,545,546],{"class":491},"  defineHttpDrain",[467,548,495],{"class":477},[467,550,552,555],{"class":469,"line":551},11,[467,553,554],{"class":491},"  composeDrains",[467,556,495],{"class":477},[467,558,560],{"class":469,"line":559},12,[467,561,526],{"emptyLinePlaceholder":525},[467,563,565],{"class":469,"line":564},13,[467,566,567],{"class":484},"  \u002F\u002F Enrichers\n",[467,569,571,574],{"class":469,"line":570},14,[467,572,573],{"class":491},"  defineEnricher",[467,575,495],{"class":477},[467,577,579,582],{"class":469,"line":578},15,[467,580,581],{"class":491},"  composeEnrichers",[467,583,495],{"class":477},[467,585,587],{"class":469,"line":586},16,[467,588,526],{"emptyLinePlaceholder":525},[467,590,592],{"class":469,"line":591},17,[467,593,594],{"class":484},"  \u002F\u002F Tail sampling\n",[467,596,598,601],{"class":469,"line":597},18,[467,599,600],{"class":491},"  composeKeep",[467,602,495],{"class":477},[467,604,606],{"class":469,"line":605},19,[467,607,526],{"emptyLinePlaceholder":525},[467,609,611],{"class":469,"line":610},20,[467,612,613],{"class":484},"  \u002F\u002F Configuration\n",[467,615,617,620],{"class":469,"line":616},21,[467,618,619],{"class":491},"  defineEvlog",[467,621,495],{"class":477},[467,623,625,628],{"class":469,"line":624},22,[467,626,627],{"class":491},"  toLoggerConfig",[467,629,495],{"class":477},[467,631,633,636],{"class":469,"line":632},23,[467,634,635],{"class":491},"  toMiddlewareOptions",[467,637,495],{"class":477},[467,639,641,644],{"class":469,"line":640},24,[467,642,643],{"class":491},"  resolveAdapterConfig",[467,645,495],{"class":477},[467,647,649,652,655],{"class":469,"line":648},25,[467,650,651],{"class":473},"  type",[467,653,654],{"class":491}," ConfigField",[467,656,495],{"class":477},[467,658,660],{"class":469,"line":659},26,[467,661,526],{"emptyLinePlaceholder":525},[467,663,665],{"class":469,"line":664},27,[467,666,667],{"class":484},"  \u002F\u002F Framework integrations\n",[467,669,671,674],{"class":469,"line":670},28,[467,672,673],{"class":491},"  defineFrameworkIntegration",[467,675,495],{"class":477},[467,677,679,682],{"class":469,"line":678},29,[467,680,681],{"class":491},"  createMiddlewareLogger",[467,683,495],{"class":477},[467,685,687,690],{"class":469,"line":686},30,[467,688,689],{"class":491},"  createLoggerStorage",[467,691,495],{"class":477},[467,693,695,697,700],{"class":469,"line":694},31,[467,696,651],{"class":473},[467,698,699],{"class":491}," BaseEvlogOptions",[467,701,495],{"class":477},[467,703,705],{"class":469,"line":704},32,[467,706,526],{"emptyLinePlaceholder":525},[467,708,710],{"class":469,"line":709},33,[467,711,712],{"class":484},"  \u002F\u002F HTTP transport\n",[467,714,716,719],{"class":469,"line":715},34,[467,717,718],{"class":491},"  httpPost",[467,720,495],{"class":477},[467,722,724],{"class":469,"line":723},35,[467,725,526],{"emptyLinePlaceholder":525},[467,727,729],{"class":469,"line":728},36,[467,730,731],{"class":484},"  \u002F\u002F Helpers\n",[467,733,735,738],{"class":469,"line":734},37,[467,736,737],{"class":491},"  getHeader",[467,739,495],{"class":477},[467,741,743,746],{"class":469,"line":742},38,[467,744,745],{"class":491},"  normalizeNumber",[467,747,495],{"class":477},[467,749,751,754],{"class":469,"line":750},39,[467,752,753],{"class":491},"  extractSafeHeaders",[467,755,495],{"class":477},[467,757,759,762],{"class":469,"line":758},40,[467,760,761],{"class":491},"  extractSafeNodeHeaders",[467,763,495],{"class":477},[467,765,767,770],{"class":469,"line":766},41,[467,768,769],{"class":491},"  mergeEventField",[467,771,495],{"class":477},[467,773,775,778],{"class":469,"line":774},42,[467,776,777],{"class":491},"  toTypedAttributeValue",[467,779,495],{"class":477},[467,781,783,786],{"class":469,"line":782},43,[467,784,785],{"class":491},"  toOtlpAttributeValue",[467,787,495],{"class":477},[467,789,791,794],{"class":469,"line":790},44,[467,792,793],{"class":491},"  OTEL_SEVERITY_NUMBER",[467,795,495],{"class":477},[467,797,799,802],{"class":469,"line":798},45,[467,800,801],{"class":491},"  OTEL_SEVERITY_TEXT",[467,803,495],{"class":477},[467,805,807,810,813,816,819],{"class":469,"line":806},46,[467,808,809],{"class":477},"}",[467,811,812],{"class":473}," from",[467,814,815],{"class":477}," '",[467,817,439],{"class":818},"sfazB",[467,820,821],{"class":477},"'\n",[453,823,825],{"id":824},"the-plugin-contract","The plugin contract",[434,827,828,831],{},[437,829,830],{},"definePlugin"," is the canonical extension contract. Drains and enrichers are sugar over it.",[458,833,835],{"className":460,"code":834,"language":462,"meta":463,"style":463},"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",[437,836,837,858,862,883,902,906,923,956,961,965,979,1035,1039,1043,1056,1115,1119,1123,1142,1185,1189,1193,1211,1258,1263,1268,1272,1276,1289,1294,1298,1302,1317,1322,1326],{"__ignoreMap":463},[467,838,839,841,844,847,850,852,854,856],{"class":469,"line":470},[467,840,474],{"class":473},[467,842,843],{"class":477}," {",[467,845,846],{"class":491}," definePlugin",[467,848,849],{"class":477}," }",[467,851,812],{"class":473},[467,853,815],{"class":477},[467,855,439],{"class":818},[467,857,821],{"class":477},[467,859,860],{"class":469,"line":481},[467,861,526],{"emptyLinePlaceholder":525},[467,863,864,868,871,874,877,880],{"class":469,"line":488},[467,865,867],{"class":866},"spNyl","const",[467,869,870],{"class":491}," requestMetricsPlugin ",[467,872,873],{"class":477},"=",[467,875,846],{"class":876},"s2Zo4",[467,878,879],{"class":491},"(",[467,881,882],{"class":477},"{\n",[467,884,885,889,892,894,897,900],{"class":469,"line":498},[467,886,888],{"class":887},"swJcz","  name",[467,890,891],{"class":477},":",[467,893,815],{"class":477},[467,895,896],{"class":818},"request-metrics",[467,898,899],{"class":477},"'",[467,901,495],{"class":477},[467,903,904],{"class":469,"line":506},[467,905,526],{"emptyLinePlaceholder":525},[467,907,908,911,914,918,921],{"class":469,"line":514},[467,909,910],{"class":887},"  setup",[467,912,913],{"class":477},"({",[467,915,917],{"class":916},"sHdIc"," env",[467,919,920],{"class":477}," })",[467,922,478],{"class":477},[467,924,925,928,931,934,936,939,942,944,946,948,951,953],{"class":469,"line":522},[467,926,927],{"class":491},"    statsd",[467,929,930],{"class":477},".",[467,932,933],{"class":876},"init",[467,935,879],{"class":887},[467,937,938],{"class":477},"{",[467,940,941],{"class":887}," service",[467,943,891],{"class":477},[467,945,917],{"class":491},[467,947,930],{"class":477},[467,949,950],{"class":491},"service",[467,952,849],{"class":477},[467,954,955],{"class":887},")\n",[467,957,958],{"class":469,"line":529},[467,959,960],{"class":477},"  },\n",[467,962,963],{"class":469,"line":535},[467,964,526],{"emptyLinePlaceholder":525},[467,966,967,970,972,975,977],{"class":469,"line":543},[467,968,969],{"class":887},"  enrich",[467,971,913],{"class":477},[467,973,974],{"class":916}," event",[467,976,920],{"class":477},[467,978,478],{"class":477},[467,980,981,984,986,989,992,994,996,999,1002,1004,1006,1008,1011,1015,1018,1020,1023,1025,1028,1030,1033],{"class":469,"line":551},[467,982,983],{"class":491},"    event",[467,985,930],{"class":477},[467,987,988],{"class":491},"tier",[467,990,991],{"class":477}," =",[467,993,974],{"class":491},[467,995,930],{"class":477},[467,997,998],{"class":491},"duration",[467,1000,1001],{"class":477}," &&",[467,1003,974],{"class":491},[467,1005,930],{"class":477},[467,1007,998],{"class":491},[467,1009,1010],{"class":477}," >",[467,1012,1014],{"class":1013},"sbssI"," 1000",[467,1016,1017],{"class":477}," ?",[467,1019,815],{"class":477},[467,1021,1022],{"class":818},"slow",[467,1024,899],{"class":477},[467,1026,1027],{"class":477}," :",[467,1029,815],{"class":477},[467,1031,1032],{"class":818},"fast",[467,1034,821],{"class":477},[467,1036,1037],{"class":469,"line":559},[467,1038,960],{"class":477},[467,1040,1041],{"class":469,"line":564},[467,1042,526],{"emptyLinePlaceholder":525},[467,1044,1045,1048,1050,1052,1054],{"class":469,"line":570},[467,1046,1047],{"class":887},"  drain",[467,1049,913],{"class":477},[467,1051,974],{"class":916},[467,1053,920],{"class":477},[467,1055,478],{"class":477},[467,1057,1058,1060,1062,1065,1067,1069,1072,1074,1077,1079,1081,1083,1086,1090,1092,1094,1097,1099,1101,1103,1106,1108,1111,1113],{"class":469,"line":578},[467,1059,927],{"class":491},[467,1061,930],{"class":477},[467,1063,1064],{"class":876},"timing",[467,1066,879],{"class":887},[467,1068,899],{"class":477},[467,1070,1071],{"class":818},"http.request",[467,1073,899],{"class":477},[467,1075,1076],{"class":477},",",[467,1078,974],{"class":491},[467,1080,930],{"class":477},[467,1082,998],{"class":491},[467,1084,1085],{"class":473}," as",[467,1087,1089],{"class":1088},"sBMFI"," number",[467,1091,1076],{"class":477},[467,1093,843],{"class":477},[467,1095,1096],{"class":887}," path",[467,1098,891],{"class":477},[467,1100,974],{"class":491},[467,1102,930],{"class":477},[467,1104,1105],{"class":491},"path",[467,1107,1085],{"class":473},[467,1109,1110],{"class":1088}," string",[467,1112,849],{"class":477},[467,1114,955],{"class":887},[467,1116,1117],{"class":469,"line":586},[467,1118,960],{"class":477},[467,1120,1121],{"class":469,"line":591},[467,1122,526],{"emptyLinePlaceholder":525},[467,1124,1125,1128,1130,1133,1135,1138,1140],{"class":469,"line":597},[467,1126,1127],{"class":887},"  onRequestStart",[467,1129,913],{"class":477},[467,1131,1132],{"class":916}," logger",[467,1134,1076],{"class":477},[467,1136,1137],{"class":916}," request",[467,1139,920],{"class":477},[467,1141,478],{"class":477},[467,1143,1144,1147,1149,1152,1154,1156,1159,1161,1163,1166,1168,1171,1173,1176,1179,1181,1183],{"class":469,"line":605},[467,1145,1146],{"class":491},"    logger",[467,1148,930],{"class":477},[467,1150,1151],{"class":876},"set",[467,1153,879],{"class":887},[467,1155,938],{"class":477},[467,1157,1158],{"class":887}," trace",[467,1160,891],{"class":477},[467,1162,843],{"class":477},[467,1164,1165],{"class":887}," startedAt",[467,1167,891],{"class":477},[467,1169,1170],{"class":491}," Date",[467,1172,930],{"class":477},[467,1174,1175],{"class":876},"now",[467,1177,1178],{"class":887},"() ",[467,1180,809],{"class":477},[467,1182,849],{"class":477},[467,1184,955],{"class":887},[467,1186,1187],{"class":469,"line":610},[467,1188,960],{"class":477},[467,1190,1191],{"class":469,"line":616},[467,1192,526],{"emptyLinePlaceholder":525},[467,1194,1195,1198,1200,1202,1204,1207,1209],{"class":469,"line":624},[467,1196,1197],{"class":887},"  onRequestFinish",[467,1199,913],{"class":477},[467,1201,974],{"class":916},[467,1203,1076],{"class":477},[467,1205,1206],{"class":916}," durationMs",[467,1208,920],{"class":477},[467,1210,478],{"class":477},[467,1212,1213,1216,1219,1222,1224,1226,1228,1230,1233,1236,1238,1241,1243,1246,1248,1250,1253,1256],{"class":469,"line":632},[467,1214,1215],{"class":473},"    if",[467,1217,1218],{"class":887}," (",[467,1220,1221],{"class":491},"event",[467,1223,1001],{"class":477},[467,1225,1218],{"class":887},[467,1227,1221],{"class":491},[467,1229,930],{"class":477},[467,1231,1232],{"class":491},"level",[467,1234,1235],{"class":477}," ===",[467,1237,815],{"class":477},[467,1239,1240],{"class":818},"error",[467,1242,899],{"class":477},[467,1244,1245],{"class":477}," ||",[467,1247,1206],{"class":491},[467,1249,1010],{"class":477},[467,1251,1252],{"class":1013}," 5000",[467,1254,1255],{"class":887},")) ",[467,1257,882],{"class":477},[467,1259,1260],{"class":469,"line":640},[467,1261,1262],{"class":484},"      \u002F\u002F alert \u002F forward \u002F etc.\n",[467,1264,1265],{"class":469,"line":648},[467,1266,1267],{"class":477},"    }\n",[467,1269,1270],{"class":469,"line":659},[467,1271,960],{"class":477},[467,1273,1274],{"class":469,"line":664},[467,1275,526],{"emptyLinePlaceholder":525},[467,1277,1278,1281,1283,1285,1287],{"class":469,"line":670},[467,1279,1280],{"class":887},"  onClientLog",[467,1282,913],{"class":477},[467,1284,974],{"class":916},[467,1286,920],{"class":477},[467,1288,478],{"class":477},[467,1290,1291],{"class":469,"line":678},[467,1292,1293],{"class":484},"    \u002F\u002F Hook into client-side logs received via \u002Fapi\u002F_evlog\u002Fingest\n",[467,1295,1296],{"class":469,"line":686},[467,1297,960],{"class":477},[467,1299,1300],{"class":469,"line":694},[467,1301,526],{"emptyLinePlaceholder":525},[467,1303,1304,1307,1309,1312,1315],{"class":469,"line":704},[467,1305,1306],{"class":887},"  extendLogger",[467,1308,879],{"class":477},[467,1310,1311],{"class":916},"logger",[467,1313,1314],{"class":477},")",[467,1316,478],{"class":477},[467,1318,1319],{"class":469,"line":709},[467,1320,1321],{"class":484},"    \u002F\u002F Add custom typed methods to RequestLogger here\n",[467,1323,1324],{"class":469,"line":715},[467,1325,960],{"class":477},[467,1327,1328,1330],{"class":469,"line":723},[467,1329,809],{"class":477},[467,1331,955],{"class":491},[434,1333,1334,1335,1338,1339,1342,1343,1346],{},"Register it once via ",[437,1336,1337],{},"defineEvlog({ plugins: [requestMetricsPlugin] })"," or scoped per-middleware via ",[437,1340,1341],{},"evlog({ plugins: [requestMetricsPlugin] })",". Plugins run in registration order; errors in any hook are isolated and logged with the ",[437,1344,1345],{},"[evlog\u002F\u003Cname>]"," prefix.",[1348,1349,1351],"h3",{"id":1350},"sugar-plugins","Sugar plugins",[458,1353,1355],{"className":460,"code":1354,"language":462,"meta":463,"style":463},"import { drainPlugin, enricherPlugin } from 'evlog\u002Ftoolkit'\n\nconst drainOnly = drainPlugin('axiom', createAxiomDrain())\nconst enricherOnly = enricherPlugin('user-agent', createUserAgentEnricher())\n",[437,1356,1357,1381,1385,1413],{"__ignoreMap":463},[467,1358,1359,1361,1363,1366,1368,1371,1373,1375,1377,1379],{"class":469,"line":470},[467,1360,474],{"class":473},[467,1362,843],{"class":477},[467,1364,1365],{"class":491}," drainPlugin",[467,1367,1076],{"class":477},[467,1369,1370],{"class":491}," enricherPlugin",[467,1372,849],{"class":477},[467,1374,812],{"class":473},[467,1376,815],{"class":477},[467,1378,439],{"class":818},[467,1380,821],{"class":477},[467,1382,1383],{"class":469,"line":481},[467,1384,526],{"emptyLinePlaceholder":525},[467,1386,1387,1389,1392,1394,1396,1398,1400,1403,1405,1407,1410],{"class":469,"line":488},[467,1388,867],{"class":866},[467,1390,1391],{"class":491}," drainOnly ",[467,1393,873],{"class":477},[467,1395,1365],{"class":876},[467,1397,879],{"class":491},[467,1399,899],{"class":477},[467,1401,1402],{"class":818},"axiom",[467,1404,899],{"class":477},[467,1406,1076],{"class":477},[467,1408,1409],{"class":876}," createAxiomDrain",[467,1411,1412],{"class":491},"())\n",[467,1414,1415,1417,1420,1422,1424,1426,1428,1431,1433,1435,1438],{"class":469,"line":498},[467,1416,867],{"class":866},[467,1418,1419],{"class":491}," enricherOnly ",[467,1421,873],{"class":477},[467,1423,1370],{"class":876},[467,1425,879],{"class":491},[467,1427,899],{"class":477},[467,1429,1430],{"class":818},"user-agent",[467,1432,899],{"class":477},[467,1434,1076],{"class":477},[467,1436,1437],{"class":876}," createUserAgentEnricher",[467,1439,1412],{"class":491},[453,1441,1443,1446],{"id":1442},"definehttpdrain-the-adapter-recipe",[437,1444,1445],{},"defineHttpDrain"," — the adapter recipe",[458,1448,1450],{"className":460,"code":1449,"language":462,"meta":463,"style":463},"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",[437,1451,1452,1458,1464,1470,1478,1490,1494,1504,1514,1524,1534,1539,1543,1571,1610,1644,1662,1667,1671,1701,1719,1735,1753,1794,1818,1823,1847,1884,1936,1959,1968,1975],{"__ignoreMap":463},[467,1453,1454,1456],{"class":469,"line":470},[467,1455,474],{"class":473},[467,1457,478],{"class":477},[467,1459,1460,1462],{"class":469,"line":481},[467,1461,546],{"class":491},[467,1463,495],{"class":477},[467,1465,1466,1468],{"class":469,"line":488},[467,1467,643],{"class":491},[467,1469,495],{"class":477},[467,1471,1472,1474,1476],{"class":469,"line":498},[467,1473,651],{"class":473},[467,1475,654],{"class":491},[467,1477,495],{"class":477},[467,1479,1480,1482,1484,1486,1488],{"class":469,"line":506},[467,1481,809],{"class":477},[467,1483,812],{"class":473},[467,1485,815],{"class":477},[467,1487,439],{"class":818},[467,1489,821],{"class":477},[467,1491,1492],{"class":469,"line":514},[467,1493,526],{"emptyLinePlaceholder":525},[467,1495,1496,1499,1502],{"class":469,"line":522},[467,1497,1498],{"class":866},"interface",[467,1500,1501],{"class":1088}," AcmeConfig",[467,1503,478],{"class":477},[467,1505,1506,1509,1511],{"class":469,"line":529},[467,1507,1508],{"class":887},"  apiKey",[467,1510,891],{"class":477},[467,1512,1513],{"class":1088}," string\n",[467,1515,1516,1519,1522],{"class":469,"line":535},[467,1517,1518],{"class":887},"  endpoint",[467,1520,1521],{"class":477},"?:",[467,1523,1513],{"class":1088},[467,1525,1526,1529,1531],{"class":469,"line":543},[467,1527,1528],{"class":887},"  timeout",[467,1530,1521],{"class":477},[467,1532,1533],{"class":1088}," number\n",[467,1535,1536],{"class":469,"line":551},[467,1537,1538],{"class":477},"}\n",[467,1540,1541],{"class":469,"line":559},[467,1542,526],{"emptyLinePlaceholder":525},[467,1544,1545,1547,1550,1552,1554,1557,1560,1563,1566,1568],{"class":469,"line":564},[467,1546,867],{"class":866},[467,1548,1549],{"class":491}," FIELDS",[467,1551,891],{"class":477},[467,1553,654],{"class":1088},[467,1555,1556],{"class":477},"\u003C",[467,1558,1559],{"class":1088},"AcmeConfig",[467,1561,1562],{"class":477},">",[467,1564,1565],{"class":491},"[] ",[467,1567,873],{"class":477},[467,1569,1570],{"class":491}," [\n",[467,1572,1573,1576,1579,1581,1583,1586,1588,1590,1592,1594,1597,1599,1602,1604,1607],{"class":469,"line":570},[467,1574,1575],{"class":477},"  {",[467,1577,1578],{"class":887}," key",[467,1580,891],{"class":477},[467,1582,815],{"class":477},[467,1584,1585],{"class":818},"apiKey",[467,1587,899],{"class":477},[467,1589,1076],{"class":477},[467,1591,917],{"class":887},[467,1593,891],{"class":477},[467,1595,1596],{"class":491}," [",[467,1598,899],{"class":477},[467,1600,1601],{"class":818},"ACME_API_KEY",[467,1603,899],{"class":477},[467,1605,1606],{"class":491},"] ",[467,1608,1609],{"class":477},"},\n",[467,1611,1612,1614,1616,1618,1620,1623,1625,1627,1629,1631,1633,1635,1638,1640,1642],{"class":469,"line":578},[467,1613,1575],{"class":477},[467,1615,1578],{"class":887},[467,1617,891],{"class":477},[467,1619,815],{"class":477},[467,1621,1622],{"class":818},"endpoint",[467,1624,899],{"class":477},[467,1626,1076],{"class":477},[467,1628,917],{"class":887},[467,1630,891],{"class":477},[467,1632,1596],{"class":491},[467,1634,899],{"class":477},[467,1636,1637],{"class":818},"ACME_ENDPOINT",[467,1639,899],{"class":477},[467,1641,1606],{"class":491},[467,1643,1609],{"class":477},[467,1645,1646,1648,1650,1652,1654,1657,1659],{"class":469,"line":586},[467,1647,1575],{"class":477},[467,1649,1578],{"class":887},[467,1651,891],{"class":477},[467,1653,815],{"class":477},[467,1655,1656],{"class":818},"timeout",[467,1658,899],{"class":477},[467,1660,1661],{"class":477}," },\n",[467,1663,1664],{"class":469,"line":591},[467,1665,1666],{"class":491},"]\n",[467,1668,1669],{"class":469,"line":597},[467,1670,526],{"emptyLinePlaceholder":525},[467,1672,1673,1676,1679,1682,1684,1687,1689,1692,1694,1696,1699],{"class":469,"line":605},[467,1674,1675],{"class":473},"export",[467,1677,1678],{"class":866}," function",[467,1680,1681],{"class":876}," createAcmeDrain",[467,1683,879],{"class":477},[467,1685,1686],{"class":916},"overrides",[467,1688,1521],{"class":477},[467,1690,1691],{"class":1088}," Partial",[467,1693,1556],{"class":477},[467,1695,1559],{"class":1088},[467,1697,1698],{"class":477},">)",[467,1700,478],{"class":477},[467,1702,1703,1706,1709,1711,1713,1715,1717],{"class":469,"line":610},[467,1704,1705],{"class":473},"  return",[467,1707,1708],{"class":876}," defineHttpDrain",[467,1710,1556],{"class":477},[467,1712,1559],{"class":1088},[467,1714,1562],{"class":477},[467,1716,879],{"class":887},[467,1718,882],{"class":477},[467,1720,1721,1724,1726,1728,1731,1733],{"class":469,"line":616},[467,1722,1723],{"class":887},"    name",[467,1725,891],{"class":477},[467,1727,815],{"class":477},[467,1729,1730],{"class":818},"acme",[467,1732,899],{"class":477},[467,1734,495],{"class":477},[467,1736,1737,1740,1742,1745,1748,1751],{"class":469,"line":624},[467,1738,1739],{"class":876},"    resolve",[467,1741,891],{"class":477},[467,1743,1744],{"class":866}," async",[467,1746,1747],{"class":477}," ()",[467,1749,1750],{"class":866}," =>",[467,1752,478],{"class":477},[467,1754,1755,1758,1761,1763,1766,1769,1771,1773,1775,1777,1779,1781,1783,1785,1787,1789,1792],{"class":469,"line":632},[467,1756,1757],{"class":866},"      const",[467,1759,1760],{"class":491}," cfg",[467,1762,991],{"class":477},[467,1764,1765],{"class":473}," await",[467,1767,1768],{"class":876}," resolveAdapterConfig",[467,1770,1556],{"class":477},[467,1772,1559],{"class":1088},[467,1774,1562],{"class":477},[467,1776,879],{"class":887},[467,1778,899],{"class":477},[467,1780,1730],{"class":818},[467,1782,899],{"class":477},[467,1784,1076],{"class":477},[467,1786,1549],{"class":491},[467,1788,1076],{"class":477},[467,1790,1791],{"class":491}," overrides",[467,1793,955],{"class":887},[467,1795,1796,1799,1801,1803,1805,1807,1809,1811,1813,1815],{"class":469,"line":640},[467,1797,1798],{"class":473},"      return",[467,1800,1760],{"class":491},[467,1802,930],{"class":477},[467,1804,1585],{"class":491},[467,1806,1017],{"class":477},[467,1808,1760],{"class":491},[467,1810,1085],{"class":473},[467,1812,1501],{"class":1088},[467,1814,1027],{"class":477},[467,1816,1817],{"class":477}," null\n",[467,1819,1820],{"class":469,"line":648},[467,1821,1822],{"class":477},"    },\n",[467,1824,1825,1828,1830,1832,1835,1837,1839,1841,1843,1845],{"class":469,"line":659},[467,1826,1827],{"class":876},"    encode",[467,1829,891],{"class":477},[467,1831,1218],{"class":477},[467,1833,1834],{"class":916},"events",[467,1836,1076],{"class":477},[467,1838,1760],{"class":916},[467,1840,1314],{"class":477},[467,1842,1750],{"class":866},[467,1844,1218],{"class":887},[467,1846,882],{"class":477},[467,1848,1849,1852,1854,1857,1860,1862,1865,1868,1870,1873,1876,1879,1882],{"class":469,"line":664},[467,1850,1851],{"class":887},"      url",[467,1853,891],{"class":477},[467,1855,1856],{"class":477}," `${",[467,1858,1859],{"class":491},"cfg",[467,1861,930],{"class":477},[467,1863,1864],{"class":491},"endpoint ",[467,1866,1867],{"class":477},"??",[467,1869,815],{"class":477},[467,1871,1872],{"class":818},"https:\u002F\u002Fapi.acme.com",[467,1874,1875],{"class":477},"'}",[467,1877,1878],{"class":818},"\u002Fv1\u002Fingest",[467,1880,1881],{"class":477},"`",[467,1883,495],{"class":477},[467,1885,1886,1889,1891,1893,1895,1898,1900,1902,1904,1907,1909,1911,1914,1916,1919,1922,1925,1927,1929,1931,1934],{"class":469,"line":670},[467,1887,1888],{"class":887},"      headers",[467,1890,891],{"class":477},[467,1892,843],{"class":477},[467,1894,815],{"class":477},[467,1896,1897],{"class":887},"Content-Type",[467,1899,899],{"class":477},[467,1901,891],{"class":477},[467,1903,815],{"class":477},[467,1905,1906],{"class":818},"application\u002Fjson",[467,1908,899],{"class":477},[467,1910,1076],{"class":477},[467,1912,1913],{"class":887}," Authorization",[467,1915,891],{"class":477},[467,1917,1918],{"class":477}," `",[467,1920,1921],{"class":818},"Bearer ",[467,1923,1924],{"class":477},"${",[467,1926,1859],{"class":491},[467,1928,930],{"class":477},[467,1930,1585],{"class":491},[467,1932,1933],{"class":477},"}`",[467,1935,1661],{"class":477},[467,1937,1938,1941,1943,1946,1948,1951,1953,1955,1957],{"class":469,"line":678},[467,1939,1940],{"class":887},"      body",[467,1942,891],{"class":477},[467,1944,1945],{"class":491}," JSON",[467,1947,930],{"class":477},[467,1949,1950],{"class":876},"stringify",[467,1952,879],{"class":887},[467,1954,1834],{"class":491},[467,1956,1314],{"class":887},[467,1958,495],{"class":477},[467,1960,1961,1964,1966],{"class":469,"line":686},[467,1962,1963],{"class":477},"    }",[467,1965,1314],{"class":887},[467,1967,495],{"class":477},[467,1969,1970,1973],{"class":469,"line":694},[467,1971,1972],{"class":477},"  }",[467,1974,955],{"class":887},[467,1976,1977],{"class":469,"line":704},[467,1978,1538],{"class":477},[434,1980,1981,1983],{},[437,1982,1445],{}," handles batching, retries (default 2), timeouts (default 5000ms), and error isolation.",[453,1985,1987,1990],{"id":1986},"defineenricher-the-enricher-recipe",[437,1988,1989],{},"defineEnricher"," — the enricher recipe",[458,1992,1994],{"className":460,"code":1993,"language":462,"meta":463,"style":463},"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",[437,1995,1996,2020,2024,2055,2070,2085,2104,2131,2151,2155],{"__ignoreMap":463},[467,1997,1998,2000,2002,2005,2007,2010,2012,2014,2016,2018],{"class":469,"line":470},[467,1999,474],{"class":473},[467,2001,843],{"class":477},[467,2003,2004],{"class":491}," defineEnricher",[467,2006,1076],{"class":477},[467,2008,2009],{"class":491}," getHeader",[467,2011,849],{"class":477},[467,2013,812],{"class":473},[467,2015,815],{"class":477},[467,2017,439],{"class":818},[467,2019,821],{"class":477},[467,2021,2022],{"class":469,"line":481},[467,2023,526],{"emptyLinePlaceholder":525},[467,2025,2026,2028,2031,2034,2036,2038,2041,2044,2046,2048,2051,2053],{"class":469,"line":488},[467,2027,1675],{"class":473},[467,2029,2030],{"class":866}," const",[467,2032,2033],{"class":491}," tenantEnricher ",[467,2035,873],{"class":477},[467,2037,2004],{"class":876},[467,2039,2040],{"class":477},"\u003C{",[467,2042,2043],{"class":887}," id",[467,2045,891],{"class":477},[467,2047,1110],{"class":1088},[467,2049,2050],{"class":477}," }>",[467,2052,879],{"class":491},[467,2054,882],{"class":477},[467,2056,2057,2059,2061,2063,2066,2068],{"class":469,"line":498},[467,2058,888],{"class":887},[467,2060,891],{"class":477},[467,2062,815],{"class":477},[467,2064,2065],{"class":818},"tenant",[467,2067,899],{"class":477},[467,2069,495],{"class":477},[467,2071,2072,2075,2077,2079,2081,2083],{"class":469,"line":506},[467,2073,2074],{"class":887},"  field",[467,2076,891],{"class":477},[467,2078,815],{"class":477},[467,2080,2065],{"class":818},[467,2082,899],{"class":477},[467,2084,495],{"class":477},[467,2086,2087,2090,2092,2095,2098,2100,2102],{"class":469,"line":514},[467,2088,2089],{"class":876},"  compute",[467,2091,891],{"class":477},[467,2093,2094],{"class":477}," ({",[467,2096,2097],{"class":916}," headers",[467,2099,920],{"class":477},[467,2101,1750],{"class":866},[467,2103,478],{"class":477},[467,2105,2106,2109,2111,2113,2115,2117,2120,2122,2124,2127,2129],{"class":469,"line":522},[467,2107,2108],{"class":866},"    const",[467,2110,2043],{"class":491},[467,2112,991],{"class":477},[467,2114,2009],{"class":876},[467,2116,879],{"class":887},[467,2118,2119],{"class":491},"headers",[467,2121,1076],{"class":477},[467,2123,815],{"class":477},[467,2125,2126],{"class":818},"x-tenant-id",[467,2128,899],{"class":477},[467,2130,955],{"class":887},[467,2132,2133,2136,2138,2140,2142,2144,2146,2148],{"class":469,"line":529},[467,2134,2135],{"class":473},"    return",[467,2137,2043],{"class":491},[467,2139,1017],{"class":477},[467,2141,843],{"class":477},[467,2143,2043],{"class":491},[467,2145,849],{"class":477},[467,2147,1027],{"class":477},[467,2149,2150],{"class":477}," undefined\n",[467,2152,2153],{"class":469,"line":535},[467,2154,960],{"class":477},[467,2156,2157,2159],{"class":469,"line":543},[467,2158,809],{"class":477},[467,2160,955],{"class":491},[453,2162,2164,2167],{"id":2163},"defineevlog-canonical-config",[437,2165,2166],{},"defineEvlog"," — canonical config",[434,2169,2170,2171,2174],{},"A single config object that works everywhere — ",[437,2172,2173],{},"initLogger",", framework middlewares, the Nuxt module, Workers.",[458,2176,2178],{"className":460,"code":2177,"language":462,"meta":463,"style":463},"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",[437,2179,2180,2209,2213,2230,2246,2268,2281,2294,2306,2312,2316,2321,2333,2337,2342],{"__ignoreMap":463},[467,2181,2182,2184,2186,2189,2191,2194,2196,2199,2201,2203,2205,2207],{"class":469,"line":470},[467,2183,474],{"class":473},[467,2185,843],{"class":477},[467,2187,2188],{"class":491}," defineEvlog",[467,2190,1076],{"class":477},[467,2192,2193],{"class":491}," toLoggerConfig",[467,2195,1076],{"class":477},[467,2197,2198],{"class":491}," toMiddlewareOptions",[467,2200,849],{"class":477},[467,2202,812],{"class":473},[467,2204,815],{"class":477},[467,2206,439],{"class":818},[467,2208,821],{"class":477},[467,2210,2211],{"class":469,"line":481},[467,2212,526],{"emptyLinePlaceholder":525},[467,2214,2215,2217,2219,2222,2224,2226,2228],{"class":469,"line":488},[467,2216,1675],{"class":473},[467,2218,2030],{"class":866},[467,2220,2221],{"class":491}," evlogConfig ",[467,2223,873],{"class":477},[467,2225,2188],{"class":876},[467,2227,879],{"class":491},[467,2229,882],{"class":477},[467,2231,2232,2235,2237,2239,2242,2244],{"class":469,"line":498},[467,2233,2234],{"class":887},"  service",[467,2236,891],{"class":477},[467,2238,815],{"class":477},[467,2240,2241],{"class":818},"shop",[467,2243,899],{"class":477},[467,2245,495],{"class":477},[467,2247,2248,2251,2253,2256,2258,2261,2263,2266],{"class":469,"line":506},[467,2249,2250],{"class":887},"  environment",[467,2252,891],{"class":477},[467,2254,2255],{"class":491}," process",[467,2257,930],{"class":477},[467,2259,2260],{"class":491},"env",[467,2262,930],{"class":477},[467,2264,2265],{"class":491},"NODE_ENV",[467,2267,495],{"class":477},[467,2269,2270,2272,2274,2276,2279],{"class":469,"line":514},[467,2271,1047],{"class":887},[467,2273,891],{"class":477},[467,2275,1409],{"class":876},[467,2277,2278],{"class":491},"()",[467,2280,495],{"class":477},[467,2282,2283,2285,2287,2290,2292],{"class":469,"line":522},[467,2284,969],{"class":887},[467,2286,891],{"class":477},[467,2288,2289],{"class":876}," createDefaultEnrichers",[467,2291,2278],{"class":491},[467,2293,495],{"class":477},[467,2295,2296,2299,2301,2304],{"class":469,"line":529},[467,2297,2298],{"class":887},"  plugins",[467,2300,891],{"class":477},[467,2302,2303],{"class":491}," [requestMetricsPlugin]",[467,2305,495],{"class":477},[467,2307,2308,2310],{"class":469,"line":535},[467,2309,809],{"class":477},[467,2311,955],{"class":491},[467,2313,2314],{"class":469,"line":543},[467,2315,526],{"emptyLinePlaceholder":525},[467,2317,2318],{"class":469,"line":551},[467,2319,2320],{"class":484},"\u002F\u002F Standalone\n",[467,2322,2323,2325,2327,2330],{"class":469,"line":559},[467,2324,2173],{"class":876},[467,2326,879],{"class":491},[467,2328,2329],{"class":876},"toLoggerConfig",[467,2331,2332],{"class":491},"(evlogConfig))\n",[467,2334,2335],{"class":469,"line":564},[467,2336,526],{"emptyLinePlaceholder":525},[467,2338,2339],{"class":469,"line":570},[467,2340,2341],{"class":484},"\u002F\u002F Framework\n",[467,2343,2344,2347,2349,2352,2354,2357,2359,2362],{"class":469,"line":578},[467,2345,2346],{"class":491},"app",[467,2348,930],{"class":477},[467,2350,2351],{"class":876},"use",[467,2353,879],{"class":491},[467,2355,2356],{"class":876},"evlog",[467,2358,879],{"class":491},[467,2360,2361],{"class":876},"toMiddlewareOptions",[467,2363,2364],{"class":491},"(evlogConfig)))\n",[453,2366,2368,2371],{"id":2367},"defineframeworkintegration-the-framework-recipe",[437,2369,2370],{},"defineFrameworkIntegration"," — the framework recipe",[434,2373,2374,2375,2378,2379,2382],{},"For any framework with a ",[437,2376,2377],{},"(ctx, next)"," middleware shape (Hono, Express, Elysia, Fastify, …) — see ",[2380,2381,285],"a",{"href":286}," for the full guide.",[453,2384,2386],{"id":2385},"composition","Composition",[458,2388,2390],{"className":460,"code":2389,"language":462,"meta":463,"style":463},"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",[437,2391,2392,2421,2425,2452,2477,2491,2533,2561],{"__ignoreMap":463},[467,2393,2394,2396,2398,2401,2403,2406,2408,2411,2413,2415,2417,2419],{"class":469,"line":470},[467,2395,474],{"class":473},[467,2397,843],{"class":477},[467,2399,2400],{"class":491}," composeDrains",[467,2402,1076],{"class":477},[467,2404,2405],{"class":491}," composeEnrichers",[467,2407,1076],{"class":477},[467,2409,2410],{"class":491}," composeKeep",[467,2412,849],{"class":477},[467,2414,812],{"class":473},[467,2416,815],{"class":477},[467,2418,439],{"class":818},[467,2420,821],{"class":477},[467,2422,2423],{"class":469,"line":481},[467,2424,526],{"emptyLinePlaceholder":525},[467,2426,2427,2429,2432,2434,2436,2439,2442,2444,2446,2449],{"class":469,"line":488},[467,2428,867],{"class":866},[467,2430,2431],{"class":491}," drain ",[467,2433,873],{"class":477},[467,2435,2400],{"class":876},[467,2437,2438],{"class":491},"([",[467,2440,2441],{"class":876},"createAxiomDrain",[467,2443,2278],{"class":491},[467,2445,1076],{"class":477},[467,2447,2448],{"class":876}," createSentryDrain",[467,2450,2451],{"class":491},"()])\n",[467,2453,2454,2456,2459,2461,2463,2465,2468,2470,2472,2475],{"class":469,"line":498},[467,2455,867],{"class":866},[467,2457,2458],{"class":491}," enrich ",[467,2460,873],{"class":477},[467,2462,2405],{"class":876},[467,2464,2438],{"class":491},[467,2466,2467],{"class":876},"createUserAgentEnricher",[467,2469,2278],{"class":491},[467,2471,1076],{"class":477},[467,2473,2474],{"class":876}," createGeoEnricher",[467,2476,2451],{"class":491},[467,2478,2479,2481,2484,2486,2488],{"class":469,"line":506},[467,2480,867],{"class":866},[467,2482,2483],{"class":491}," keep ",[467,2485,873],{"class":477},[467,2487,2410],{"class":876},[467,2489,2490],{"class":491},"([\n",[467,2492,2493,2496,2499,2501,2504,2506,2508,2511,2514,2516,2518,2521,2523,2527,2529,2531],{"class":469,"line":514},[467,2494,2495],{"class":477},"  ({",[467,2497,2498],{"class":916}," duration",[467,2500,1076],{"class":477},[467,2502,2503],{"class":916}," shouldKeep",[467,2505,920],{"class":477},[467,2507,1750],{"class":866},[467,2509,2510],{"class":491}," duration ",[467,2512,2513],{"class":477},"&&",[467,2515,2510],{"class":491},[467,2517,1562],{"class":477},[467,2519,2520],{"class":1013}," 2000",[467,2522,1017],{"class":477},[467,2524,2526],{"class":2525},"sfNiH"," true",[467,2528,1027],{"class":477},[467,2530,2503],{"class":491},[467,2532,495],{"class":477},[467,2534,2535,2537,2539,2541,2543,2545,2547,2550,2553,2555,2557,2559],{"class":469,"line":522},[467,2536,2495],{"class":477},[467,2538,974],{"class":916},[467,2540,920],{"class":477},[467,2542,1750],{"class":866},[467,2544,974],{"class":491},[467,2546,930],{"class":477},[467,2548,2549],{"class":491},"level ",[467,2551,2552],{"class":477},"===",[467,2554,815],{"class":477},[467,2556,1240],{"class":818},[467,2558,899],{"class":477},[467,2560,495],{"class":477},[467,2562,2563],{"class":469,"line":529},[467,2564,2565],{"class":491},"])\n",[434,2567,2568,2569,2572],{},"All composers isolate errors in individual functions and run drains concurrently with ",[437,2570,2571],{},"Promise.allSettled"," semantics.",[453,2574,2576],{"id":2575},"helpers","Helpers",[2578,2579,2580,2593],"table",{},[2581,2582,2583],"thead",{},[2584,2585,2586,2590],"tr",{},[2587,2588,2589],"th",{},"Export",[2587,2591,2592],{},"Purpose",[2594,2595,2596,2607,2630,2640,2654,2667,2680,2693,2703,2717],"tbody",{},[2584,2597,2598,2604],{},[2599,2600,2601],"td",{},[437,2602,2603],{},"httpPost(opts)",[2599,2605,2606],{},"POST helper used by every built-in HTTP adapter — handles timeout, retries, redacted error messages",[2584,2608,2609,2614],{},[2599,2610,2611],{},[437,2612,2613],{},"resolveAdapterConfig(ns, fields, overrides)",[2599,2615,2616,2617,2620,2621,2620,2624,2620,2627],{},"Standard config priority: overrides → ",[437,2618,2619],{},"runtimeConfig.evlog.\u003Cns>"," → ",[437,2622,2623],{},"runtimeConfig.\u003Cns>",[437,2625,2626],{},"NUXT_\u003CNS>_*",[437,2628,2629],{},"\u003CNS>_*",[2584,2631,2632,2637],{},[2599,2633,2634],{},[437,2635,2636],{},"getHeader(headers, name)",[2599,2638,2639],{},"Case-insensitive HTTP header lookup",[2584,2641,2642,2647],{},[2599,2643,2644],{},[437,2645,2646],{},"normalizeNumber(value)",[2599,2648,2649,2650,2653],{},"Parse a string to number, return ",[437,2651,2652],{},"undefined"," if non-finite",[2584,2655,2656,2661],{},[2599,2657,2658],{},[437,2659,2660],{},"extractSafeHeaders(headers)",[2599,2662,2663,2664],{},"Filter sensitive headers from a Web ",[437,2665,2666],{},"Headers",[2584,2668,2669,2674],{},[2599,2670,2671],{},[437,2672,2673],{},"extractSafeNodeHeaders(headers)",[2599,2675,2676,2677],{},"Filter sensitive headers from Node ",[437,2678,2679],{},"IncomingHttpHeaders",[2584,2681,2682,2687],{},[2599,2683,2684],{},[437,2685,2686],{},"mergeEventField(existing, computed, overwrite?)",[2599,2688,2689,2690],{},"Merge a sub-object into an event field, respecting ",[437,2691,2692],{},"overwrite",[2584,2694,2695,2700],{},[2599,2696,2697],{},[437,2698,2699],{},"toTypedAttributeValue(value)",[2599,2701,2702],{},"Convert any value to the typed attribute shape used by Axiom \u002F Sentry",[2584,2704,2705,2710],{},[2599,2706,2707],{},[437,2708,2709],{},"toOtlpAttributeValue(value)",[2599,2711,2712,2713,2716],{},"Convert any value to the OTLP ",[437,2714,2715],{},"AnyValue"," shape (used by OTLP \u002F HyperDX \u002F PostHog logs)",[2584,2718,2719,2728],{},[2599,2720,2721,2724,2725],{},[437,2722,2723],{},"OTEL_SEVERITY_NUMBER",", ",[437,2726,2727],{},"OTEL_SEVERITY_TEXT",[2599,2729,2730],{},"OTEL log severity tables",[453,2732,2734],{"id":2733},"building-a-community-package","Building a community package",[434,2736,2737],{},"The recommended structure for a community package on top of evlog:",[458,2739,2744],{"className":2740,"code":2742,"language":2743},[2741],"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",[437,2745,2742],{"__ignoreMap":463},[434,2747,2748,2749,2751,2752,2755],{},"Add ",[437,2750,2356],{}," as a ",[437,2753,2754],{},"peerDependency"," (not a dependency) — your package shouldn't pull in a copy of evlog at install time.",[442,2757,2760,2761,2767],{"color":2758,"icon":2759},"neutral","i-lucide-heart","Built something great? ",[2380,2762,2766],{"href":2763,"rel":2764},"https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog\u002Fpulls",[2765],"nofollow","Open a PR"," to add a row to the Adapters \u002F Enrichers tables — the community will thank you.",[453,2769,2771],{"id":2770},"see-also","See Also",[2773,2774,2775,2784,2791,2797,2802],"ul",{},[2776,2777,2778,2780,2781,2783],"li",{},[2380,2779,403],{"href":404}," — the ",[437,2782,1445],{}," recipe in detail",[2776,2785,2786,2780,2789,2783],{},[2380,2787,2788],{"href":425},"Custom Enrichers",[437,2790,1989],{},[2776,2792,2793,2780,2795,2783],{},[2380,2794,285],{"href":286},[437,2796,2370],{},[2776,2798,2799,2801],{},[2380,2800,393],{"href":394}," — batching and retry primitives for high-throughput drains",[2776,2803,2804,2807],{},[2380,2805,2806],{"href":399},"HTTP drain"," — browser→server log transport",[2809,2810,2811],"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":463,"searchDepth":481,"depth":481,"links":2813},[2814,2815,2818,2820,2822,2824,2826,2827,2828,2829],{"id":455,"depth":481,"text":456},{"id":824,"depth":481,"text":825,"children":2816},[2817],{"id":1350,"depth":488,"text":1351},{"id":1442,"depth":481,"text":2819},"defineHttpDrain — the adapter recipe",{"id":1986,"depth":481,"text":2821},"defineEnricher — the enricher recipe",{"id":2163,"depth":481,"text":2823},"defineEvlog — canonical config",{"id":2367,"depth":481,"text":2825},"defineFrameworkIntegration — the framework recipe",{"id":2385,"depth":481,"text":2386},{"id":2575,"depth":481,"text":2576},{"id":2733,"depth":481,"text":2734},{"id":2770,"depth":481,"text":2771},"The evlog\u002Ftoolkit public API — every primitive used to build adapters, enrichers, plugins, and framework integrations.","md",[2833,2835],{"label":403,"icon":83,"to":404,"color":2758,"variant":2834},"subtle",{"label":285,"icon":288,"to":286,"color":2758,"variant":2834},{},{"title":407,"icon":410},{"title":429,"description":2830},"gAoEh3mMuCFYojVzta-qdi-w-2ms-dsmyK--lB4350E",[2841,2843],{"title":403,"path":404,"stem":405,"description":2842,"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":417,"stem":418,"description":2844,"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.",1778349075684]