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