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