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