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