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