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