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