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