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