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