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