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