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