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