[{"data":1,"prerenderedAt":1916},["ShallowReactive",2],{"navigation_docs":3,"-extend-plugins":447,"-extend-plugins-surround":1911},[4,30,80,245,361,416],{"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,353],{"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":349,"path":350,"stem":351,"icon":352},"Enrichers","\u002Fuse-cases\u002Fenrichers","4.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":354,"icon":261,"path":355,"stem":356,"children":357,"page":29},"Eve","\u002Fuse-cases\u002Feve","4.use-cases\u002F5.eve",[358],{"title":36,"path":359,"stem":360,"icon":261},"\u002Fuse-cases\u002Feve\u002Foverview","4.use-cases\u002F5.eve\u002F01.overview",{"title":362,"path":363,"stem":364,"children":365,"page":29},"Extend","\u002Fextend","5.extend",[366,370,375,380,385,389,393,397,401,406,411],{"title":36,"path":367,"stem":368,"icon":369},"\u002Fextend\u002Foverview","5.extend\u002F0.overview","i-lucide-blocks",{"title":371,"path":372,"stem":373,"icon":374},"Stream","\u002Fextend\u002Fstream","5.extend\u002F1.stream","i-lucide-radio-tower",{"title":376,"path":377,"stem":378,"icon":379},"Custom framework","\u002Fextend\u002Fcustom-framework","5.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":381,"path":382,"stem":383,"icon":384},"FS reader","\u002Fextend\u002Ffs-reader","5.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":345,"path":386,"stem":387,"icon":388},"\u002Fextend\u002Fconsumer-recipes","5.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":390,"path":391,"stem":392,"icon":369},"Plugins","\u002Fextend\u002Fplugins","5.extend\u002F4.plugins",{"title":394,"path":395,"stem":396,"icon":352},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","5.extend\u002F5.custom-enrichers",{"title":398,"path":399,"stem":400,"icon":64},"Tail sampling","\u002Fextend\u002Ftail-sampling","5.extend\u002F6.tail-sampling",{"title":402,"path":403,"stem":404,"icon":405},"Identity headers","\u002Fextend\u002Fidentity-headers","5.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":407,"path":408,"stem":409,"icon":410},"Custom drains","\u002Fextend\u002Fcustom-drains","5.extend\u002F8.custom-drains","i-lucide-share-2",{"title":412,"path":413,"stem":414,"icon":415},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","5.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":417,"path":418,"stem":419,"children":420,"page":29},"Reference","\u002Freference","6.reference",[421,426,429,434,438,443],{"title":422,"path":423,"stem":424,"icon":425},"Configuration","\u002Freference\u002Fconfiguration","6.reference\u002F1.configuration","i-lucide-settings",{"title":312,"path":427,"stem":428,"icon":315},"\u002Freference\u002Fperformance","6.reference\u002F2.performance",{"title":430,"path":431,"stem":432,"icon":433},"Vite Plugin","\u002Freference\u002Fvite-plugin","6.reference\u002F3.vite-plugin","i-custom-vite",{"title":435,"path":436,"stem":437,"icon":318},"Best Practices","\u002Freference\u002Fbest-practices","6.reference\u002F4.best-practices",{"title":439,"path":440,"stem":441,"icon":442},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","6.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":444,"path":445,"stem":446,"icon":352},"Agent Skills","\u002Freference\u002Fagent-skills","6.reference\u002F6.agent-skills",{"id":448,"title":390,"body":449,"description":1899,"extension":1900,"links":1901,"meta":1907,"navigation":1908,"path":391,"seo":1909,"stem":392,"__hash__":1910},"docs\u002F5.extend\u002F4.plugins.md",{"type":450,"value":451,"toc":1891},"minimark",[452,455,468,488,575,580,839,842,1074,1077,1219,1233,1237,1252,1685,1689,1698,1789,1796,1800,1857,1861,1887],[453,454],"lifecycle-flow",{},[456,457,458,462,463,467],"p",{},[459,460,461],"code",{},"definePlugin()"," is the ",[464,465,466],"strong",{},"canonical extension point"," for evlog. Drains and enrichers are special cases of plugins, but a single plugin can opt into multiple hooks at once — the right shape for any non-trivial extension that mixes several concerns (e.g. enrich on every event + side-effect on drain + keep decision on tail sampling, all reading the same shared state).",[456,469,470,471,477,478,483,484,487],{},"When the extension only does one thing, prefer the single-purpose ",[472,473,474],"a",{"href":395},[459,475,476],{},"enricherPlugin()"," \u002F ",[472,479,480],{"href":408},[459,481,482],{},"drainPlugin()"," wrappers. Reach for ",[459,485,486],{},"definePlugin"," when several hooks share state.",[489,490,493,496,567],"prompt",{":actions":491,"description":492,"icon":369},"[\"copy\",\"cursor\",\"windsurf\"]","Build a multi-hook evlog plugin",[456,494,495],{},"Build an evlog plugin that hooks into more than one lifecycle stage.",[497,498,499,533,539,542,556],"ul",{},[500,501,502,503,505,506,509,510,513,514,513,517,513,520,513,523,513,526,513,529,532],"li",{},"Import ",[459,504,486],{}," from ",[459,507,508],{},"evlog"," and pick the hooks I need (",[459,511,512],{},"onRequestStart",", ",[459,515,516],{},"enrich",[459,518,519],{},"drain",[459,521,522],{},"extendLogger",[459,524,525],{},"keep",[459,527,528],{},"onClientLog",[459,530,531],{},"onRequestFinish",")",[500,534,535,536,538],{},"Keep ",[459,537,516],{}," pure (no I\u002FO, no throwing — use try\u002Fcatch internally)",[500,540,541],{},"For drains, batch and ship to the destination; respect backpressure if the sink is slow",[500,543,544,545,548,549,552,553,532],{},"Register the plugin via the framework config: Next\u002Fstandalone ",[459,546,547],{},"initLogger({ plugins: [myPlugin] })",", Hono\u002FExpress\u002FFastify\u002FElysia middleware option ",[459,550,551],{},"{ plugins: [myPlugin] }",". For Nitro, register the individual hooks directly (",[459,554,555],{},"nitroApp.hooks.hook('evlog:enrich' | 'evlog:drain' | …)",[500,557,558,559,477,561,563,564,566],{},"Prefer single-purpose ",[459,560,476],{},[459,562,482],{}," wrappers for simple extensions; use ",[459,565,486],{}," only when several hooks are needed",[456,568,569,570],{},"Docs: ",[472,571,572],{"href":572,"rel":573},"https:\u002F\u002Fwww.evlog.dev\u002Fextend\u002Fplugins",[574],"nofollow",[576,577,579],"h2",{"id":578},"minimal-example","Minimal example",[581,582,587],"pre",{"className":583,"code":584,"language":585,"meta":586,"style":586},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { definePlugin } from 'evlog'\n\nexport const tenantPlugin = definePlugin({\n  name: 'tenant',\n  onRequestStart({ logger, headers }) {\n    const tenantId = headers?.['x-tenant-id']\n    if (tenantId) logger.set({ tenant: { id: tenantId } })\n  },\n  enrich({ event }) {\n    event.region = process.env.REGION\n  },\n})\n","ts","",[459,588,589,621,628,653,674,699,729,779,785,800,826,831],{"__ignoreMap":586},[590,591,594,598,602,606,609,612,615,618],"span",{"class":592,"line":593},"line",1,[590,595,597],{"class":596},"s7zQu","import",[590,599,601],{"class":600},"sMK4o"," {",[590,603,605],{"class":604},"sTEyZ"," definePlugin",[590,607,608],{"class":600}," }",[590,610,611],{"class":596}," from",[590,613,614],{"class":600}," '",[590,616,508],{"class":617},"sfazB",[590,619,620],{"class":600},"'\n",[590,622,624],{"class":592,"line":623},2,[590,625,627],{"emptyLinePlaceholder":626},true,"\n",[590,629,631,634,638,641,644,647,650],{"class":592,"line":630},3,[590,632,633],{"class":596},"export",[590,635,637],{"class":636},"spNyl"," const",[590,639,640],{"class":604}," tenantPlugin ",[590,642,643],{"class":600},"=",[590,645,605],{"class":646},"s2Zo4",[590,648,649],{"class":604},"(",[590,651,652],{"class":600},"{\n",[590,654,656,660,663,665,668,671],{"class":592,"line":655},4,[590,657,659],{"class":658},"swJcz","  name",[590,661,662],{"class":600},":",[590,664,614],{"class":600},[590,666,667],{"class":617},"tenant",[590,669,670],{"class":600},"'",[590,672,673],{"class":600},",\n",[590,675,677,680,683,687,690,693,696],{"class":592,"line":676},5,[590,678,679],{"class":658},"  onRequestStart",[590,681,682],{"class":600},"({",[590,684,686],{"class":685},"sHdIc"," logger",[590,688,689],{"class":600},",",[590,691,692],{"class":685}," headers",[590,694,695],{"class":600}," })",[590,697,698],{"class":600}," {\n",[590,700,702,705,708,711,713,716,719,721,724,726],{"class":592,"line":701},6,[590,703,704],{"class":636},"    const",[590,706,707],{"class":604}," tenantId",[590,709,710],{"class":600}," =",[590,712,692],{"class":604},[590,714,715],{"class":600},"?.",[590,717,718],{"class":658},"[",[590,720,670],{"class":600},[590,722,723],{"class":617},"x-tenant-id",[590,725,670],{"class":600},[590,727,728],{"class":658},"]\n",[590,730,732,735,738,741,744,747,750,753,755,758,761,763,765,768,770,772,774,776],{"class":592,"line":731},7,[590,733,734],{"class":596},"    if",[590,736,737],{"class":658}," (",[590,739,740],{"class":604},"tenantId",[590,742,743],{"class":658},") ",[590,745,746],{"class":604},"logger",[590,748,749],{"class":600},".",[590,751,752],{"class":646},"set",[590,754,649],{"class":658},[590,756,757],{"class":600},"{",[590,759,760],{"class":658}," tenant",[590,762,662],{"class":600},[590,764,601],{"class":600},[590,766,767],{"class":658}," id",[590,769,662],{"class":600},[590,771,707],{"class":604},[590,773,608],{"class":600},[590,775,608],{"class":600},[590,777,778],{"class":658},")\n",[590,780,782],{"class":592,"line":781},8,[590,783,784],{"class":600},"  },\n",[590,786,788,791,793,796,798],{"class":592,"line":787},9,[590,789,790],{"class":658},"  enrich",[590,792,682],{"class":600},[590,794,795],{"class":685}," event",[590,797,695],{"class":600},[590,799,698],{"class":600},[590,801,803,806,808,811,813,816,818,821,823],{"class":592,"line":802},10,[590,804,805],{"class":604},"    event",[590,807,749],{"class":600},[590,809,810],{"class":604},"region",[590,812,710],{"class":600},[590,814,815],{"class":604}," process",[590,817,749],{"class":600},[590,819,820],{"class":604},"env",[590,822,749],{"class":600},[590,824,825],{"class":604},"REGION\n",[590,827,829],{"class":592,"line":828},11,[590,830,784],{"class":600},[590,832,834,837],{"class":592,"line":833},12,[590,835,836],{"class":600},"}",[590,838,778],{"class":604},[456,840,841],{},"Register the plugin where you bootstrap evlog. The shape depends on your runtime:",[843,844,845,915,993],"code-group",{},[581,846,849],{"className":583,"code":847,"filename":848,"language":585,"meta":586,"style":586},"import { initLogger } from 'evlog'\nimport { tenantPlugin } from '.\u002Fplugins\u002Ftenant'\n\ninitLogger({ plugins: [tenantPlugin] })\n","Next.js \u002F standalone",[459,850,851,870,890,894],{"__ignoreMap":586},[590,852,853,855,857,860,862,864,866,868],{"class":592,"line":593},[590,854,597],{"class":596},[590,856,601],{"class":600},[590,858,859],{"class":604}," initLogger",[590,861,608],{"class":600},[590,863,611],{"class":596},[590,865,614],{"class":600},[590,867,508],{"class":617},[590,869,620],{"class":600},[590,871,872,874,876,879,881,883,885,888],{"class":592,"line":623},[590,873,597],{"class":596},[590,875,601],{"class":600},[590,877,878],{"class":604}," tenantPlugin",[590,880,608],{"class":600},[590,882,611],{"class":596},[590,884,614],{"class":600},[590,886,887],{"class":617},".\u002Fplugins\u002Ftenant",[590,889,620],{"class":600},[590,891,892],{"class":592,"line":630},[590,893,627],{"emptyLinePlaceholder":626},[590,895,896,899,901,903,906,908,911,913],{"class":592,"line":655},[590,897,898],{"class":646},"initLogger",[590,900,649],{"class":604},[590,902,757],{"class":600},[590,904,905],{"class":658}," plugins",[590,907,662],{"class":600},[590,909,910],{"class":604}," [tenantPlugin] ",[590,912,836],{"class":600},[590,914,778],{"class":604},[581,916,919],{"className":583,"code":917,"filename":918,"language":585,"meta":586,"style":586},"import { evlogMiddleware } from 'evlog\u002F\u003Cframework>'\nimport { tenantPlugin } from '.\u002Fplugins\u002Ftenant'\n\napp.use(evlogMiddleware({ plugins: [tenantPlugin] }))\n","Hono \u002F Express \u002F Fastify \u002F Elysia",[459,920,921,941,959,963],{"__ignoreMap":586},[590,922,923,925,927,930,932,934,936,939],{"class":592,"line":593},[590,924,597],{"class":596},[590,926,601],{"class":600},[590,928,929],{"class":604}," evlogMiddleware",[590,931,608],{"class":600},[590,933,611],{"class":596},[590,935,614],{"class":600},[590,937,938],{"class":617},"evlog\u002F\u003Cframework>",[590,940,620],{"class":600},[590,942,943,945,947,949,951,953,955,957],{"class":592,"line":623},[590,944,597],{"class":596},[590,946,601],{"class":600},[590,948,878],{"class":604},[590,950,608],{"class":600},[590,952,611],{"class":596},[590,954,614],{"class":600},[590,956,887],{"class":617},[590,958,620],{"class":600},[590,960,961],{"class":592,"line":630},[590,962,627],{"emptyLinePlaceholder":626},[590,964,965,968,970,973,975,978,980,982,984,986,988,990],{"class":592,"line":655},[590,966,967],{"class":604},"app",[590,969,749],{"class":600},[590,971,972],{"class":646},"use",[590,974,649],{"class":604},[590,976,977],{"class":646},"evlogMiddleware",[590,979,649],{"class":604},[590,981,757],{"class":600},[590,983,905],{"class":658},[590,985,662],{"class":600},[590,987,910],{"class":604},[590,989,836],{"class":600},[590,991,992],{"class":604},"))\n",[581,994,996],{"className":583,"code":995,"filename":182,"language":585,"meta":586,"style":586},"\u002F\u002F Register the hooks you actually use directly:\nnitroApp.hooks.hook('evlog:enrich', tenantPlugin.enrich!)\nnitroApp.hooks.hook('evlog:request:start', tenantPlugin.onRequestStart!)\n",[459,997,998,1004,1041],{"__ignoreMap":586},[590,999,1000],{"class":592,"line":593},[590,1001,1003],{"class":1002},"sHwdD","\u002F\u002F Register the hooks you actually use directly:\n",[590,1005,1006,1009,1011,1014,1016,1019,1021,1023,1026,1028,1030,1032,1034,1036,1039],{"class":592,"line":623},[590,1007,1008],{"class":604},"nitroApp",[590,1010,749],{"class":600},[590,1012,1013],{"class":604},"hooks",[590,1015,749],{"class":600},[590,1017,1018],{"class":646},"hook",[590,1020,649],{"class":604},[590,1022,670],{"class":600},[590,1024,1025],{"class":617},"evlog:enrich",[590,1027,670],{"class":600},[590,1029,689],{"class":600},[590,1031,878],{"class":604},[590,1033,749],{"class":600},[590,1035,516],{"class":604},[590,1037,1038],{"class":600},"!",[590,1040,778],{"class":604},[590,1042,1043,1045,1047,1049,1051,1053,1055,1057,1060,1062,1064,1066,1068,1070,1072],{"class":592,"line":630},[590,1044,1008],{"class":604},[590,1046,749],{"class":600},[590,1048,1013],{"class":604},[590,1050,749],{"class":600},[590,1052,1018],{"class":646},[590,1054,649],{"class":604},[590,1056,670],{"class":600},[590,1058,1059],{"class":617},"evlog:request:start",[590,1061,670],{"class":600},[590,1063,689],{"class":600},[590,1065,878],{"class":604},[590,1067,749],{"class":600},[590,1069,512],{"class":604},[590,1071,1038],{"class":600},[590,1073,778],{"class":604},[576,1075,1076],{"id":1013},"Hooks",[1078,1079,1080,1096],"table",{},[1081,1082,1083],"thead",{},[1084,1085,1086,1090,1093],"tr",{},[1087,1088,1089],"th",{},"Hook",[1087,1091,1092],{},"When",[1087,1094,1095],{},"Use it for",[1097,1098,1099,1116,1131,1144,1164,1177,1190,1203],"tbody",{},[1084,1100,1101,1107,1110],{},[1102,1103,1104],"td",{},[459,1105,1106],{},"setup(ctx)",[1102,1108,1109],{},"Once when registered",[1102,1111,1112,1113,1115],{},"Read ",[459,1114,820],{},", set up shared state",[1084,1117,1118,1123,1126],{},[1102,1119,1120],{},[459,1121,1122],{},"onRequestStart(ctx)",[1102,1124,1125],{},"Each request, before any handler runs",[1102,1127,1128,1129],{},"Pull values from headers into ",[459,1130,746],{},[1084,1132,1133,1138,1141],{},[1102,1134,1135],{},[459,1136,1137],{},"enrich(ctx)",[1102,1139,1140],{},"Every event, before drain",[1102,1142,1143],{},"Add derived fields (geo, deploy id…)",[1084,1145,1146,1151,1154],{},[1102,1147,1148],{},[459,1149,1150],{},"keep(ctx)",[1102,1152,1153],{},"Tail sampling decision",[1102,1155,1156,1157,513,1160,1163],{},"Force-keep based on outcome (",[459,1158,1159],{},"status >= 400",[459,1161,1162],{},"duration > 500",", …)",[1084,1165,1166,1171,1174],{},[1102,1167,1168],{},[459,1169,1170],{},"drain(ctx)",[1102,1172,1173],{},"Every emitted event",[1102,1175,1176],{},"Side-effect: alert, mirror to a queue, etc.",[1084,1178,1179,1184,1187],{},[1102,1180,1181],{},[459,1182,1183],{},"onRequestFinish(ctx)",[1102,1185,1186],{},"After response",[1102,1188,1189],{},"Per-request post-processing",[1084,1191,1192,1197,1200],{},[1102,1193,1194],{},[459,1195,1196],{},"onClientLog(ctx)",[1102,1198,1199],{},"Browser-submitted event hits the ingest endpoint",[1102,1201,1202],{},"Observe \u002F reject client traffic",[1084,1204,1205,1210,1213],{},[1102,1206,1207],{},[459,1208,1209],{},"extendLogger(logger)",[1102,1211,1212],{},"Each request",[1102,1214,1215,1216,532],{},"Add custom methods (e.g. ",[459,1217,1218],{},"logger.audit.refund()",[456,1220,1221,1222,1225,1226,749],{},"Every hook is ",[464,1223,1224],{},"optional",". A plugin can implement any subset. The full type lives in ",[472,1227,1230],{"href":1228,"rel":1229},"https:\u002F\u002Fgithub.com\u002FHugoRCD\u002Fevlog\u002Fblob\u002Fmain\u002Fpackages\u002Fevlog\u002Fsrc\u002Fshared\u002Fplugin.ts",[574],[459,1231,1232],{},"packages\u002Fevlog\u002Fsrc\u002Fshared\u002Fplugin.ts",[576,1234,1236],{"id":1235},"a-multi-hook-example","A multi-hook example",[456,1238,1239,1240,1243,1244,513,1247,1249,1250,662],{},"Plugins shine when several concerns share state. Here, a single ",[459,1241,1242],{},"request-metrics"," plugin tracks per-request timing through ",[459,1245,1246],{},"setup",[459,1248,512],{},", and ",[459,1251,519],{},[581,1253,1255],{"className":583,"code":1254,"language":585,"meta":586,"style":586},"import { definePlugin } from 'evlog\u002Ftoolkit'\n\nexport const requestMetricsPlugin = definePlugin({\n  name: 'request-metrics',\n\n  setup({ env }) {\n    statsd.init({ service: env.service })\n  },\n\n  enrich({ event }) {\n    event.tier = event.duration && event.duration > 1000 ? 'slow' : 'fast'\n  },\n\n  drain({ event }) {\n    statsd.timing('http.request', event.duration as number, { path: event.path as string })\n  },\n\n  onRequestStart({ logger, request }) {\n    logger.set({ trace: { startedAt: Date.now() } })\n  },\n\n  onRequestFinish({ event, durationMs }) {\n    if (event && (event.level === 'error' || durationMs > 5000)) {\n      \u002F\u002F alert \u002F forward \u002F etc.\n    }\n  },\n})\n",[459,1256,1257,1276,1280,1297,1311,1315,1329,1359,1363,1367,1379,1433,1437,1442,1456,1515,1520,1525,1543,1586,1591,1596,1615,1661,1667,1673,1678],{"__ignoreMap":586},[590,1258,1259,1261,1263,1265,1267,1269,1271,1274],{"class":592,"line":593},[590,1260,597],{"class":596},[590,1262,601],{"class":600},[590,1264,605],{"class":604},[590,1266,608],{"class":600},[590,1268,611],{"class":596},[590,1270,614],{"class":600},[590,1272,1273],{"class":617},"evlog\u002Ftoolkit",[590,1275,620],{"class":600},[590,1277,1278],{"class":592,"line":623},[590,1279,627],{"emptyLinePlaceholder":626},[590,1281,1282,1284,1286,1289,1291,1293,1295],{"class":592,"line":630},[590,1283,633],{"class":596},[590,1285,637],{"class":636},[590,1287,1288],{"class":604}," requestMetricsPlugin ",[590,1290,643],{"class":600},[590,1292,605],{"class":646},[590,1294,649],{"class":604},[590,1296,652],{"class":600},[590,1298,1299,1301,1303,1305,1307,1309],{"class":592,"line":655},[590,1300,659],{"class":658},[590,1302,662],{"class":600},[590,1304,614],{"class":600},[590,1306,1242],{"class":617},[590,1308,670],{"class":600},[590,1310,673],{"class":600},[590,1312,1313],{"class":592,"line":676},[590,1314,627],{"emptyLinePlaceholder":626},[590,1316,1317,1320,1322,1325,1327],{"class":592,"line":701},[590,1318,1319],{"class":658},"  setup",[590,1321,682],{"class":600},[590,1323,1324],{"class":685}," env",[590,1326,695],{"class":600},[590,1328,698],{"class":600},[590,1330,1331,1334,1336,1339,1341,1343,1346,1348,1350,1352,1355,1357],{"class":592,"line":731},[590,1332,1333],{"class":604},"    statsd",[590,1335,749],{"class":600},[590,1337,1338],{"class":646},"init",[590,1340,649],{"class":658},[590,1342,757],{"class":600},[590,1344,1345],{"class":658}," service",[590,1347,662],{"class":600},[590,1349,1324],{"class":604},[590,1351,749],{"class":600},[590,1353,1354],{"class":604},"service",[590,1356,608],{"class":600},[590,1358,778],{"class":658},[590,1360,1361],{"class":592,"line":781},[590,1362,784],{"class":600},[590,1364,1365],{"class":592,"line":787},[590,1366,627],{"emptyLinePlaceholder":626},[590,1368,1369,1371,1373,1375,1377],{"class":592,"line":802},[590,1370,790],{"class":658},[590,1372,682],{"class":600},[590,1374,795],{"class":685},[590,1376,695],{"class":600},[590,1378,698],{"class":600},[590,1380,1381,1383,1385,1388,1390,1392,1394,1397,1400,1402,1404,1406,1409,1413,1416,1418,1421,1423,1426,1428,1431],{"class":592,"line":828},[590,1382,805],{"class":604},[590,1384,749],{"class":600},[590,1386,1387],{"class":604},"tier",[590,1389,710],{"class":600},[590,1391,795],{"class":604},[590,1393,749],{"class":600},[590,1395,1396],{"class":604},"duration",[590,1398,1399],{"class":600}," &&",[590,1401,795],{"class":604},[590,1403,749],{"class":600},[590,1405,1396],{"class":604},[590,1407,1408],{"class":600}," >",[590,1410,1412],{"class":1411},"sbssI"," 1000",[590,1414,1415],{"class":600}," ?",[590,1417,614],{"class":600},[590,1419,1420],{"class":617},"slow",[590,1422,670],{"class":600},[590,1424,1425],{"class":600}," :",[590,1427,614],{"class":600},[590,1429,1430],{"class":617},"fast",[590,1432,620],{"class":600},[590,1434,1435],{"class":592,"line":833},[590,1436,784],{"class":600},[590,1438,1440],{"class":592,"line":1439},13,[590,1441,627],{"emptyLinePlaceholder":626},[590,1443,1445,1448,1450,1452,1454],{"class":592,"line":1444},14,[590,1446,1447],{"class":658},"  drain",[590,1449,682],{"class":600},[590,1451,795],{"class":685},[590,1453,695],{"class":600},[590,1455,698],{"class":600},[590,1457,1459,1461,1463,1466,1468,1470,1473,1475,1477,1479,1481,1483,1486,1490,1492,1494,1497,1499,1501,1503,1506,1508,1511,1513],{"class":592,"line":1458},15,[590,1460,1333],{"class":604},[590,1462,749],{"class":600},[590,1464,1465],{"class":646},"timing",[590,1467,649],{"class":658},[590,1469,670],{"class":600},[590,1471,1472],{"class":617},"http.request",[590,1474,670],{"class":600},[590,1476,689],{"class":600},[590,1478,795],{"class":604},[590,1480,749],{"class":600},[590,1482,1396],{"class":604},[590,1484,1485],{"class":596}," as",[590,1487,1489],{"class":1488},"sBMFI"," number",[590,1491,689],{"class":600},[590,1493,601],{"class":600},[590,1495,1496],{"class":658}," path",[590,1498,662],{"class":600},[590,1500,795],{"class":604},[590,1502,749],{"class":600},[590,1504,1505],{"class":604},"path",[590,1507,1485],{"class":596},[590,1509,1510],{"class":1488}," string",[590,1512,608],{"class":600},[590,1514,778],{"class":658},[590,1516,1518],{"class":592,"line":1517},16,[590,1519,784],{"class":600},[590,1521,1523],{"class":592,"line":1522},17,[590,1524,627],{"emptyLinePlaceholder":626},[590,1526,1528,1530,1532,1534,1536,1539,1541],{"class":592,"line":1527},18,[590,1529,679],{"class":658},[590,1531,682],{"class":600},[590,1533,686],{"class":685},[590,1535,689],{"class":600},[590,1537,1538],{"class":685}," request",[590,1540,695],{"class":600},[590,1542,698],{"class":600},[590,1544,1546,1549,1551,1553,1555,1557,1560,1562,1564,1567,1569,1572,1574,1577,1580,1582,1584],{"class":592,"line":1545},19,[590,1547,1548],{"class":604},"    logger",[590,1550,749],{"class":600},[590,1552,752],{"class":646},[590,1554,649],{"class":658},[590,1556,757],{"class":600},[590,1558,1559],{"class":658}," trace",[590,1561,662],{"class":600},[590,1563,601],{"class":600},[590,1565,1566],{"class":658}," startedAt",[590,1568,662],{"class":600},[590,1570,1571],{"class":604}," Date",[590,1573,749],{"class":600},[590,1575,1576],{"class":646},"now",[590,1578,1579],{"class":658},"() ",[590,1581,836],{"class":600},[590,1583,608],{"class":600},[590,1585,778],{"class":658},[590,1587,1589],{"class":592,"line":1588},20,[590,1590,784],{"class":600},[590,1592,1594],{"class":592,"line":1593},21,[590,1595,627],{"emptyLinePlaceholder":626},[590,1597,1599,1602,1604,1606,1608,1611,1613],{"class":592,"line":1598},22,[590,1600,1601],{"class":658},"  onRequestFinish",[590,1603,682],{"class":600},[590,1605,795],{"class":685},[590,1607,689],{"class":600},[590,1609,1610],{"class":685}," durationMs",[590,1612,695],{"class":600},[590,1614,698],{"class":600},[590,1616,1618,1620,1622,1625,1627,1629,1631,1633,1636,1639,1641,1644,1646,1649,1651,1653,1656,1659],{"class":592,"line":1617},23,[590,1619,734],{"class":596},[590,1621,737],{"class":658},[590,1623,1624],{"class":604},"event",[590,1626,1399],{"class":600},[590,1628,737],{"class":658},[590,1630,1624],{"class":604},[590,1632,749],{"class":600},[590,1634,1635],{"class":604},"level",[590,1637,1638],{"class":600}," ===",[590,1640,614],{"class":600},[590,1642,1643],{"class":617},"error",[590,1645,670],{"class":600},[590,1647,1648],{"class":600}," ||",[590,1650,1610],{"class":604},[590,1652,1408],{"class":600},[590,1654,1655],{"class":1411}," 5000",[590,1657,1658],{"class":658},")) ",[590,1660,652],{"class":600},[590,1662,1664],{"class":592,"line":1663},24,[590,1665,1666],{"class":1002},"      \u002F\u002F alert \u002F forward \u002F etc.\n",[590,1668,1670],{"class":592,"line":1669},25,[590,1671,1672],{"class":600},"    }\n",[590,1674,1676],{"class":592,"line":1675},26,[590,1677,784],{"class":600},[590,1679,1681,1683],{"class":592,"line":1680},27,[590,1682,836],{"class":600},[590,1684,778],{"class":604},[576,1686,1688],{"id":1687},"sugar-plugins","Sugar plugins",[456,1690,1691,1692,1694,1695,1697],{},"For single-hook extensions, the toolkit offers ",[459,1693,482],{}," and ",[459,1696,476],{}," wrappers:",[581,1699,1703],{"className":1700,"code":1701,"language":1702,"meta":586,"style":586},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { drainPlugin, enricherPlugin } from 'evlog\u002Ftoolkit'\n\nconst drainOnly = drainPlugin('axiom', createAxiomDrain())\nconst enricherOnly = enricherPlugin('user-agent', createUserAgentEnricher())\n","typescript",[459,1704,1705,1729,1733,1762],{"__ignoreMap":586},[590,1706,1707,1709,1711,1714,1716,1719,1721,1723,1725,1727],{"class":592,"line":593},[590,1708,597],{"class":596},[590,1710,601],{"class":600},[590,1712,1713],{"class":604}," drainPlugin",[590,1715,689],{"class":600},[590,1717,1718],{"class":604}," enricherPlugin",[590,1720,608],{"class":600},[590,1722,611],{"class":596},[590,1724,614],{"class":600},[590,1726,1273],{"class":617},[590,1728,620],{"class":600},[590,1730,1731],{"class":592,"line":623},[590,1732,627],{"emptyLinePlaceholder":626},[590,1734,1735,1738,1741,1743,1745,1747,1749,1752,1754,1756,1759],{"class":592,"line":630},[590,1736,1737],{"class":636},"const",[590,1739,1740],{"class":604}," drainOnly ",[590,1742,643],{"class":600},[590,1744,1713],{"class":646},[590,1746,649],{"class":604},[590,1748,670],{"class":600},[590,1750,1751],{"class":617},"axiom",[590,1753,670],{"class":600},[590,1755,689],{"class":600},[590,1757,1758],{"class":646}," createAxiomDrain",[590,1760,1761],{"class":604},"())\n",[590,1763,1764,1766,1769,1771,1773,1775,1777,1780,1782,1784,1787],{"class":592,"line":655},[590,1765,1737],{"class":636},[590,1767,1768],{"class":604}," enricherOnly ",[590,1770,643],{"class":600},[590,1772,1718],{"class":646},[590,1774,649],{"class":604},[590,1776,670],{"class":600},[590,1778,1779],{"class":617},"user-agent",[590,1781,670],{"class":600},[590,1783,689],{"class":600},[590,1785,1786],{"class":646}," createUserAgentEnricher",[590,1788,1761],{"class":604},[456,1790,1791,1792,1795],{},"These are equivalent to a ",[459,1793,1794],{},"definePlugin({ name, drain | enrich })"," shape but read more clearly when intent is obvious.",[576,1797,1799],{"id":1798},"common-pitfalls","Common pitfalls",[497,1801,1802,1811,1822,1845],{},[500,1803,1804,1807,1808,1810],{},[464,1805,1806],{},"Don't throw from a hook."," The plugin runner catches and logs errors with the plugin name, but a thrown error from ",[459,1809,516],{}," won't propagate the event downstream. Keep hooks defensive.",[500,1812,1813,1818,1819,1821],{},[464,1814,1815,1817],{},[459,1816,519],{}," runs for every event"," — not just per-request. If you only care about per-request lifecycle, use ",[459,1820,531],{}," instead.",[500,1823,1824,1829,1830,1833,1834,1837,1838,1841,1842,749],{},[464,1825,1826,1828],{},[459,1827,522],{}," mutates the logger object"," — augment ",[459,1831,1832],{},"RequestLogger"," in a ",[459,1835,1836],{},".d.ts"," so ",[459,1839,1840],{},"useLogger(event)"," exposes the new methods to TypeScript. See ",[472,1843,1844],{"href":72},"typed fields",[500,1846,1847,1853,1854,1856],{},[464,1848,1849,1850],{},"Plugins are de-duplicated by ",[459,1851,1852],{},"name",". Re-registering with the same ",[459,1855,1852],{}," replaces the previous version (last registration wins).",[576,1858,1860],{"id":1859},"next-steps","Next steps",[497,1862,1863,1869,1875,1881],{},[500,1864,1865,1868],{},[472,1866,1867],{"href":395},"Custom Enrichers"," — single-hook enrichment",[500,1870,1871,1874],{},[472,1872,1873],{"href":408},"Custom Drains"," — single-destination output",[500,1876,1877,1880],{},[472,1878,1879],{"href":399},"Tail Sampling"," — outcome-aware keep decisions",[500,1882,1883,1886],{},[472,1884,1885],{"href":403},"Identity Headers"," — tag every drain request",[1888,1889,1890],"style",{},"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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 .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 .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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":586,"searchDepth":623,"depth":623,"links":1892},[1893,1894,1895,1896,1897,1898],{"id":578,"depth":623,"text":579},{"id":1013,"depth":623,"text":1076},{"id":1235,"depth":623,"text":1236},{"id":1687,"depth":623,"text":1688},{"id":1798,"depth":623,"text":1799},{"id":1859,"depth":623,"text":1860},"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.","md",[1902,1905,1906],{"label":1867,"icon":352,"to":395,"color":1903,"variant":1904},"neutral","subtle",{"label":1873,"icon":410,"to":408,"color":1903,"variant":1904},{"label":1879,"icon":64,"to":399,"color":1903,"variant":1904},{},{"title":390,"icon":369},{"title":390,"description":1899},"V3Y6XFn7kEOgKHMLccUovjvoyQKjlGwzZq4KTU0kfxo",[1912,1914],{"title":345,"path":386,"stem":387,"description":1913,"icon":388,"children":-1},"Concrete copy-paste recipes — build your own minimal devtool, pipe to curl + jq, replay history then go live, and aggregate on the consumer side.",{"title":394,"path":395,"stem":396,"description":1915,"icon":352,"children":-1},"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.",1782924665461]