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