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