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