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