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